• Day 52 | 674. 最长连续递增序列 & 718. 最长重复子数组 & 1143.最长公共子序列


     674. 最长连续递增序列

    动态规划解题思路:    

    ①确定dp数组以及下标含义

            dp[i]:下标[0,i],以nums[i]结尾的最长递增序列长度

    ②确定递推公式

            每次遍历比较nums[i]与nums[i-1]的值。

            若大于,dp[i]=dp[i-1]+1

            否则,因为要求连续,dp[i]不变,即为初始值1.遍历下一个元素时则从1开始递增。

    ③dp数组如何初始化

            dp长度为数组长度。

            给dp数组所有元素都初始化为1,代表初始递增序列为1.

    ④确定遍历顺序

              从前向后遍历。

    ⑤举例推导dp数组

     最后返回dp数组中元素的最大值即可。

    1. public int findLengthOfLCIS(int[] nums) {
    2. int[] dp=new int[nums.length];
    3. Arrays.fill(dp,1);
    4. for(int i=1;i
    5. if(nums[i]>nums[i-1]){
    6. dp[i]=dp[i-1]+1;
    7. }
    8. }
    9. int res=1;
    10. for(int i:dp){
    11. if(i>res){
    12. res=i;
    13. }
    14. }
    15. return res;
    16. }

    718. 最长重复子数组

    dp解题思路:

    ①确定dp数组以及下标含义

            dp[i][j]:下标为[i-1]的nums1,下标为[j-1]的nums2,两个数组的最长重复子数组为dp[i][j]

    ②确定递推公式

            定义dp数组为dp[len1+1][len2+1]

            为了方便计算和初始化,每次比较的都是下标i-1与j-1的元素,将其赋值给dp[i][j](注意错位一位).

            i,j从1开始遍历(元素i-1下标为0开始遍历),

            若nums[i-1]==nums[j-1],则dp[i][j]=dp[i-1][j-1]+1;

            若不相等,因为要求连续,则为初始值0.

    ③dp数组如何初始化

            给dpdp[0][j],dp[i][0]初始化为0,代表初始重复子数组为0.

    ④确定遍历顺序

              从前向后,从上至下遍历。(i从1到len1,j从1到len2)

    ⑤举例推导dp数组

    1. public int findLength(int[] nums1, int[] nums2) {
    2. int[][] dp=new int[nums1.length+1][nums2.length+1];
    3. int res=0;
    4. for(int i=1;i<=nums1.length;i++){
    5. for(int j=1;j<=nums2.length;j++){
    6. if(nums1[i-1]==nums2[j-1]){
    7. dp[i][j]=dp[i-1][j-1]+1;
    8. }
    9. if(dp[i][j]>res){
    10. res=dp[i][j];
    11. }
    12. }
    13. }
    14. return res;
    15. }

    1143.最长公共子序列

    dp解题思路:

    ①确定dp数组以及下标含义

            dp[i][j]:下标为[i-1]的nums1,下标为[j-1]的nums2,两个字符串的最长公共子序列为dp[i][j]

    ②确定递推公式

            定义dp数组为dp[len1+1][len2+1]

            为了方便计算和初始化,每次比较的都是下标i-1与j-1的元素,将其赋值给dp[i][j](注意错位一位).

            i,j从1开始遍历(元素i-1下标为0开始遍历),

            (1)若nums1[i-1]==nums1[j-1],则

                                                                   dp[i][j]=dp[i-1][j-1]+1;

            (2)若不相等,因为不要求连续,则dp[i][j]由dp[i-1][j]和dp[i][j-1]决定,取两者的最大值。

                                                 dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j]);

    ③dp数组如何初始化

            给dpdp[0][j],dp[i][0]初始化为0,代表初始公共子序列为0.

    ④确定遍历顺序

              dp[i][j]由dp[i-1][j-1],dp[i][j-1],dp[1-1][j]三者共同决定。因此从前向后,从上至下遍历。(i从1到len1,j从1到len2)。

    ⑤举例推导dp数组

     最后返回dp[len][len]即为最长公共子序列

    1. public int longestCommonSubsequence(String text1, String text2) {
    2. int[][] dp=new int[text1.length()+1][text2.length()+1];
    3. for(int i=1;i<=text1.length();i++){
    4. for(int j=1;j<=text2.length();j++){
    5. if(text1.charAt(i-1)==text2.charAt(j-1)){
    6. dp[i][j]=dp[i-1][j-1]+1;
    7. }else{
    8. dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
    9. }
    10. }
    11. }
    12. return dp[text1.length()][text2.length()];
    13. }

  • 相关阅读:
    QT中闹钟的设置
    flink groupby keyby区别
    一、openCV+TensorFlow环境搭建
    网络安全(黑客)自学
    前端注释工具的优雅使用指南
    Scanner例题讲解
    【数智化人物展】同方有云联合创始人兼总经理江琦:云计算,引领数智化升级的动能...
    【Spring】Spring学习笔记完整篇
    GitHub/R3D3项目环境配置踩坑记录
    家政保洁预约小程序app开发特点有哪些?
  • 原文地址:https://blog.csdn.net/m0_56579820/article/details/127800310