1. 程式人生 > >LeetCode300. 最長上升子序列

LeetCode300. 最長上升子序列

題目

給定一個無序的整數陣列,找到其中最長上升子序列的長度。
示例:
輸入: [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;
    }
}