当前位置:网站首页>8.< tag-动态规划和LCS问题>lt.300. 最长递增子序列 + lt.674. 最长连续递增序列

8.< tag-动态规划和LCS问题>lt.300. 最长递增子序列 + lt.674. 最长连续递增序列

2022-07-23 03:54:00 菜菜的大数据开发之路

lt.300. 最长递增子序列

[案例需求]

在这里插入图片描述

[思路分析]

有题: dp[i] 是可以用dp[j] (j < i) 推导出来的;

  1. dp[i] 的定义

dp[i] 在 i之间包括i(即长度i + 1)的以nums[i] 结尾的最长上升子序列的长度.

  1. 状态转移方程

位置 i的最长升序子序列, 可以从更短的 dp[j] 中的最长上升子序列中得到, 如果nums[i] 在这个上升子序列中也会上升, 那么 dp[i] = dp[j] + 1, 如果不符合, 那dp[i] = dp[j]
综上来看, 状态转移方程为:
if(nums[i] > nums[j]) dp[i] = Math.max(dp[j], dp[j] + 1);
注意这里不是要dp[i] 与 dp[j] + 1进行比较,而是我们要取dp[j] + 1, dp[j] 中的最长连续上升序列的长度。

  1. dp[i]的初始化

每一个i,对应的dp[i](即最长上升子序列)起始大小至少都是1.

  1. 确定遍历顺序

dp[i] 是有0到i-1各个位置的最长升序子序列 推导而来,那么遍历i一定是从前向后遍历。
j其实就是0到i-1,遍历i的循环在外层,遍历j则在内层,代码如下:

for (int i = 1; i < nums.size(); i++) {
    
    for (int j = 0; j < i; j++) {
    
        if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
    }
    if (dp[i] > result) result = dp[i]; // 取长的子序列
}
  1. 举例推导dp数组
    在这里插入图片描述

[代码实现]

class Solution {
    
    public int lengthOfLIS(int[] nums) {
    
        //1. 确定dp[i], dp[i] 由之前的dp[j]推出来的.
        // dp[j] 表示 nums[j]前面的数的最长递增子序列
        int len = nums.length;
        int[] dp = new int[len];

        //2. 递推公式
        // 是dp[j]的递增, 不是dp[j]的递增
        //dp[i] = Math.max(dp[j] + 1, dp[j]); 

        //3. 初始化
        // dp[0] = 1.
        for(int i = 0; i < len; i++){
    
            dp[i] = 1;
        }
        //4. 确定遍历顺序, 正序遍历
        for(int i = 1; i < len; i++){
    
            for(int j = 0; j < i; j++){
    
                if(nums[i] > nums[j]){
    
                    dp[i] = Math.max(dp[j] + 1, dp[i]);
                }
            }
        }

        //取出最大的dp[i]
        int res = 0;
        for(int x : dp){
    
            res = Math.max(res, x);
        }
        return res;
    }
}

lt.674. 最长连续递增序列

[案例需求]

在这里插入图片描述

[思路分析一, 贪心]

[代码实现]


在这里插入图片描述

思路分析二, 动态规划在这里插入图片描述

class Solution {
    
     /** * 1.dp[i] 代表当前下标最大连续值 * 2.递推公式 if(nums[i+1]>nums[i]) dp[i+1] = dp[i]+1 * 3.初始化 都为1 * 4.遍历方向,从其那往后 * 5.结果推导 。。。。 * @param nums * @return */
    public static int findLengthOfLCIS(int[] nums) {
    
        int[] dp = new int[nums.length];
        for (int i = 0; i < dp.length; i++) {
    
            dp[i] = 1;
        }
        int res = 1;
        for (int i = 0; i < nums.length - 1; i++) {
    
            if (nums[i + 1] > nums[i]) {
    
                dp[i + 1] = dp[i] + 1;
            }
            res = res > dp[i + 1] ? res : dp[i + 1];
            System.out.println(Arrays.toString(Arrays.copyOf(dp, i + 1)));
        }
        return res;
    }
}

在这里插入图片描述
在这里插入图片描述

原网站

版权声明
本文为[菜菜的大数据开发之路]所创,转载请带上原文链接,感谢
https://sha-pao-zi.blog.csdn.net/article/details/125929196