Day52|动态规划part13:300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

子序列问题是动态规划解决的经典问题

300.最长递增子序列

首先我们明确一下子序列的定义,子序列与子串(必须要连续)不同,子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。

一看没啥思路,都忘光了。。。也不知道咋用动态规划做。

  1. 确定dp数组含义及下标

dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度。

这里明确dp[i]的含义很重要,因为这道题我们返回的结果不一定是dp[n - 1],而是dp中最大的一个,因为最长的序列不一定以nums[i]结尾。

想法就是如果前面的数比nums[i]小,那就是递增的,可以加入候选,我们取前面最大的加1,接到nums[i]上去,就是最长的子序列。使用两层for循环

  1. dp数组的初始化

每个dp[i]即子序列长度最小都是1。

  1. 确定遍历顺序

没什么好说的,从前往后。

  1. 打印dp数组

Day52|动态规划part13:300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组_第1张图片

最终代码:

class Solution {
   
    public int lengthOfLIS(int[] nums) {
   
        int dp [] = new int[nums.length];
        for(int i = 0; i < dp.length; i++){
   
            dp[i] = 1;//初始子序列的长度都是1
        }
        int res = 1;
        for(int i = 1

你可能感兴趣的:(数据结构与算法(二刷),动态规划,算法)