1、題目數組
一、審題spa
二、分析code
給出一個無序的整形數組,求其中遞增的最大序列的元素個數。blog
2、解答class
一、思路方法
方法1、im
採用 dp 數組,長度爲 nums 的元素個數。img
①、dp[index] 記錄當前下標 index 對應元素與前邊的數組元素組成的最大遞增序列的個數。di
②、dp 全部元素初始化爲 1。 當此元素值比前頭 下標 i 的元素大時,dp[index] = MAX[dp[index], dp[i] + 1]。while
③、返回 dp 中的最大值。
public int lengthOfLIS(int[] nums) { int len = nums.length; int[] dp = new int[len]; Arrays.fill(dp, 1);; for (int i = 1; i < len; i++) { for (int j = i - 1; j >= 0; j--) { if(nums[i] > nums[j]) dp[i] = Math.max(dp[i], dp[j] + 1); } } int res = 0; for (int i = 0; i < len; i++) { res = Math.max(res, dp[i]); } return res; }
方法2、
維護一個新數組 tails。
①、tails 存放最優狀態的遞增序列。後邊出現的元素 x 有兩種情況:
a、 x比 tails 中全部元素都大,則 tails 放在尾部。
b、tails[i - 1] < x < tails[x], 則 tails[i] = x;
②、故 更新 tails 數組能夠採用 二分查找。最終返回的是 tails 數組中的元素的個數。
public int lengthOfLIS2(int[] nums) { int[] tails = new int[nums.length]; int size = 0; for(int x: nums) { int i = 0, j = size; while(i != j) { int m = (i + j) / 2; if(tails[m] < x) i = m + 1; else j = m; } tails[i] = x; if(i == size) size++; } return size; }