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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38595487/article/details/83904086