LeetCode300. 最長上升子序列
阿新 • • 發佈:2018-11-20
題目
給定一個無序的整數陣列,找到其中最長上升子序列的長度。
示例:
輸入: [10,9,2,5,3,7,101,18]
輸出: 4
解釋: 最長的上升子序列是 [2,3,7,101],它的長度是 4。
說明:
可能會有多種最長上升子序列的組合,你只需要輸出對應的長度即可。
你演算法的時間複雜度應該為 O(n2) 。
進階: 你能將演算法的時間複雜度降低到 O(n log n) 嗎?
分析
儲存每個數字的最長子序列,用dp[i]來表示索引index為i的數字的最長序列長度。
例如 示例中的序列,當遍歷到3的時候,看一下index為0的數字10,是不是小於自己啊,不,下一個,index為1的數字9,小於自己嘛不,下一個數字2,小於自己,那麼數字5的最長序列長度dp[5],可能可能就是dp[2]+1,還要繼續向下看,看5,小於自己麼,啊不,遍歷完啦,那麼dp[5]就等於上面遍歷過程中的最大數。
簡單來說:
dp[i] = Max( dp[x1]+1, dp[x2]+1, dp[x3]+1 …… )
nums[x1] nums[x2] nums[x3] …… < nums[i] 且 x1 x2 x3 …… < i
返回的最後結果是最大的一個dp
程式碼
class Solution { public int lengthOfLIS(int[] nums) { int len = nums.length; if (len == 0) return 0; int result = 1; // max int[] dp = new int[len]; Arrays.fill(dp,1); for (int i = 1; i < len; i++) { for (int j = 0; j < i; j++) if (nums[j] < nums[i]) dp[i] = Math.max(dp[i], dp[j]+1); result = Math.max(dp[i], result); } return result; } }