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

文章目录

  • 总结
  • 一、300.最长递增子序列
  • 二、674. 最长连续递增序列
  • 三、718. 最长重复子数组


总结

动态规划解决的子序列问题!
子序列问题的递推公式是在条件判断里的

一、300.最长递增子序列

  1. dp[i]:i之前包括i的以nums[i]结尾的最长递增子序列的长度
  2. 递推公式! if(nums[i]>nums[j]){ dp[i] = Math.max(dp[i],dp[j]+1); }
    位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。
    public int lengthOfLIS(int[] nums) {
        int[] dp = new int[nums.length];//以nums[i]结尾的最大长度。
        Arrays.fill(dp,1);
        for(int i=1;i<nums.length;i++){
            for(int j=0;j<=i;j++){
                if(nums[i]>nums[j]){
                    dp[i] = Math.max(dp[i],dp[j]+1);
                }
            }
        }
        int max = 0;
        for(int i=0;i<dp.length;i++){
            max = Math.max(max,dp[i]);
        }
        return max;

    }

20分钟

二、674. 最长连续递增序列

  1. 这里判断条件只能是连续的两个之间。而不能是j从0-i循环遍历
  2. 记得初始化
    public int findLengthOfLCIS(int[] nums) {
        int[] dp = new int[nums.length];
        Arrays.fill(dp,1);
        for(int i=1;i<nums.length;i++){
            if(nums[i]>nums[i-1]){
                dp[i] = dp[i-1]+1;
            }
        }
        int result = 0;
        for(int i=0;i<dp.length;i++){
            result = Math.max(result,dp[i]);
        }
        return result;
    }

20分钟

三、718. 最长重复子数组

  1. 用二维数组来表示两个字符串的所有比较情况,以i-1,j-1为结尾
  2. 初始化第一行和第一列的数据。
    public int findLength(int[] nums1, int[] nums2) {
        int[][] dp = new int[nums1.length+1][nums2.length+1];
        int max =  0;
        for(int i=1;i<=nums1.length;i++){
            for(int j=1;j<=nums2.length;j++){
                // if(nums1[i]==nums2[j]){
                //     dp[i][j] = dp[i-1][j-1]+1;
                // }
                if(nums1[i-1]==nums2[j-1]){
                    dp[i][j] = dp[i-1][j-1]+1;
                    max = Math.max(max,dp[i][j]);
                }
            }
        }
        return max;
    }

29分钟

下面的dp[i][j]表示以i和j为结尾的,上面的是以i-1,j-1结尾。

    public int findLength(int[] nums1, int[] nums2) {
        int[][] dp = new int[nums1.length][nums2.length];
        int max =  0;
        for(int i=0;i<nums1.length;i++){
            if(nums1[i]==nums2[0]){
                dp[i][0] = 1;
            }
        }
        for(int j=0;j<nums2.length;j++){
            if(nums1[0]==nums2[j]){
                dp[0][j] = 1;
            }
        }
        // for(int i=1;i
        //     for(int j=1;j
        //         // if(nums1[i]==nums2[j]){
        //         //     dp[i][j] = dp[i-1][j-1]+1;
        //         // }
        //         if(nums1[i]==nums2[j]){
        //             dp[i][j] = dp[i-1][j-1]+1;
        //         }
        //         max = Math.max(max,dp[i][j]);   
        //     }
        // }
        for(int i=0;i<nums1.length;i++){
            for(int j=0;j<nums2.length;j++){
                // if(nums1[i]==nums2[j]){
                //     dp[i][j] = dp[i-1][j-1]+1;
                // }
                if(i>0&&j>0&&nums1[i]==nums2[j]){
                    dp[i][j] = dp[i-1][j-1]+1;
                }
                max = Math.max(max,dp[i][j]);   
            }
        }
        return max;
    }

你可能感兴趣的:(算法,动态规划)