最長遞增子序列

class Solution { private static int upperBound(int[] s, int len, int k) { int first = 0; while (len > 0) { int half = len >>> 1; int m = first + half; // 非嚴格遞增s[m] <= k,嚴格遞增s[m] < k if (s[m] <= k) { len -= half + 1; first = m + 1; } else { len = half; } } return first; } private static int function(int[] x) { if (x == null || x.length == 0) { return 0; } int[] dp = new int[x.length]; int max = 1; dp[0] = x[0]; for (int i = 1;i < x.length; ++ i) { int index = upperBound(dp, max, x[i]); if (index < max) { dp[index] = x[i]; } else { dp[max ++] = x[i]; } } return max; } public int lengthOfLIS(int[] nums) { return function(nums); } }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章