代码随想录算法训练营第52天|300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组

300.最长递增子序列

力扣题目链接

思路

  • dp[i] 表示以nums[i]结尾的最长递增子序列长度
  • 递推公式:dp[i]=max(dp[i],dp[j]+1);
  • 初始化:都初始为1
  • 遍历顺序:从前往后

代码

class Solution {
public:
    /*
     * dp[i] 表示以nums[i]结尾的最长递增子序列长度
     * 递推公式:dp[i]=max(dp[i],dp[j]+1);
     * 初始化:都初始为1
     * 遍历顺序:从前往后
    */
    int lengthOfLIS(vector& nums) {
        vector dp(nums.size(),1);
        int result=1;
        for(int i=1;inums[j]) dp[i]=max(dp[i],dp[j]+1);
            result=max(result,dp[i]);
        }
        return result;
    }
};
  • 时间复杂度O(n^2)
  • 空间复杂度O(n)

674. 最长连续递增序列

力扣题目链接

思路

动态规划

  • dp[i] 表示以nums[i]结尾的最长连续递增子序列
  • 递推公式:if(nums[i]>nums[i-1]) dp[i]=dp[i-1]+1;
  • 初始化:都初始化为1
  • 遍历顺序:从前往后

贪心

  • 得到尽可能长的递增子序列

总结

  • 不连续递增子序列的跟前0-i 个状态有关,连续递增的子序列只跟前一个状态有关

代码

动态规划

class Solution {
public:
    /*
     * dp[i] 表示以nums[i]结尾的最长连续递增子序列
     * 递推公式:if(nums[i]>nums[i-1]) dp[i]=dp[i-1]+1;
     * 初始化:都初始化为1
     * 遍历顺序:从前往后
    */
    int findLengthOfLCIS(vector& nums) {
        if(nums.size()==0) return 0;
        vector dp(nums.size(),1);
        int result=1;
        for(int i=1;inums[i-1])
                dp[i]=dp[i-1]+1;
            result=max(result,dp[i]);
        }
        return result;
    }
};
  • 时间复杂度O(n)
  • 空间复杂度O(n)

贪心

class Solution {
public:
    //贪心
    int findLengthOfLCIS(vector& nums) {
        if(nums.size()==0) return 0;
        int result=1;
        int count=1;
        for(int i=1;inums[i-1]) count++;
            else count=1;
            result=max(result,count);
        }
        return result;
    }
};
  • 时间复杂度O(n)
  • 空间复杂度O(1)

718. 最长重复子数组

力扣题目链接

思路

动态规划

  • dp[i][j] 表示分别以nums[i]和nums[j]结尾的公共的 、长度最长的子数组的长度

​ * 递推公式:dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);

​ * 初始化:都初始化为0

​ * 遍历顺序:从前往后

代码

动态规划

class Solution {
public:
    /*
     * dp[i][j] 表示分别以nums[i]和nums[j]结尾的公共的 、长度最长的子数组的长度
     * 递推公式:dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
     * 初始化:都初始化为0
     * 遍历顺序:从前往后
    */
    int findLength(vector& nums1, vector& nums2) {
        vector> dp(nums1.size(),vector(nums2.size(),0));
        int result=0;
        for(int i=0;i
  • 时间复杂度O(N*M)
  • 空间复杂度O(NM)

你可能感兴趣的:(代码随想录刷题,算法,leetcode,动态规划)