码迷,mamicode.com
首页 > 其他好文 > 详细

300. 最长上升子序列(动态规划)

时间:2020-07-19 23:31:12      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:进一步   ges   etc   解释   ppt   int   turn   length   输入   

https://leetcode-cn.com/problems/longest-increasing-subsequence/

1、题目:

  给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
说明:

可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

2、思路:

(1)定义状态:

? 假设数组是 nums, [10, 2, 2, 5, 1, 7, 101, 18]
?dp(i) 是以 nums[i] 结尾的最长上升子序列的长度,i ∈ [0, nums.length)
? 以 nums[0] 10 结尾的最长上升子序列是 10,所以 dp(0) = 1
? 以 nums[1] 2 结尾的最长上升子序列是 2,所以 dp(1) = 1
? 以 nums[2] 2 结尾的最长上升子序列是 2,所以 dp(2) = 1
? 以 nums[3] 5 结尾的最长上升子序列是 2、5,所以 dp(3) = dp(1) + 1 = dp(2) + 1 = 2
? 以 nums[4] 1 结尾的最长上升子序列是 1,所以 dp(4) = 1
? 以 nums[5] 7 结尾的最长上升子序列是 2、5、7,所以 dp(5) = dp(3) + 1 = 3
? 以 nums[6] 101 结尾的最长上升子序列是 2、5、7、101,所以 dp(6) = dp(5) + 1 = 4
? 以 nums[7] 18 结尾的最长上升子序列是 2、5、7、18,所以 dp(7) = dp(5) + 1 = 4

? 最长上升子序列的长度是所有 dp(i) 中的最大值 max { dp(i) },i ∈ [0, nums.length)

 

? 遍历 j ∈ [0, i)
?当 nums[i] > nums[j]
? nums[i] 可以接在 nums[j] 后面,形成一个比 dp(j) 更长的上升子序列,长度为 dp(j) + 1
? dp(i) = max { dp(i), dp(j) + 1 }
?当 nums[i] ≤ nums[j]
? nums[i] 不能接在 nums[j] 后面,跳过此次遍历(continue)


? 状态的初始值
?dp(0) = 1
?所有的 dp(i) 默认都初始化为 1

3、代码

class Solution {
    public int lengthOfLIS(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int[] dp = new int[nums.length];
        int max = dp[0] = 1;
        for (int i = 1; i < nums.length; i++) {
            dp[i] = 1;
            //需要遍历之前所有元素进行比较
            for (int j = 0; j < i; j++) {
                //若nums[i]<nums[i-1],没法拼接,只要大于的
                if (nums[i] <= nums[j]) continue;
                dp[i] = Math.max(dp[i], dp[j] + 1);

            }
            max = Math.max(dp[i], max);
        }
        return max;
    }
}

还可以进一步优化,见ppt

 

300. 最长上升子序列(动态规划)

标签:进一步   ges   etc   解释   ppt   int   turn   length   输入   

原文地址:https://www.cnblogs.com/guoyu1/p/13340873.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!