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

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

  • 300.最长递增子序列
    • 文章
    • 思路
    • 代码
  • 674.最长连续递增序列
    • 文章
    • 思路
    • 代码
  • 718.最长重复子数组
    • 文章
    • 思路
    • 代码
  • 总结

300.最长递增子序列

文章

代码随想录|0300.最长上升子序列

思路

d p [ i ] = M a x ( M a x n u m s [ i ] > n u m s [ j ] & & i > j ( d p [ j ] ) + 1 , 1 ) dp[i] = Max(Max_{nums[i]>nums[j]\&\&i >j}(dp[j]) + 1, 1) dp[i]=Max(Maxnums[i]>nums[j]&&i>j(dp[j])+1,1)

代码

class Solution {
    public int lengthOfLIS(int[] nums) {
        int i, j, n;
        int res = 1;
        n = nums.length;
        int[] dp = new int[n];
        for (i = 0; i < n; ++i) {
            dp[i] = 1;
            for (j = i - 1; j > -1; --j) {
                if (nums[i] > nums[j]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                     res  = res > dp[i] ? res : dp[i];
                }
            }
        }
        return res;
    }
}

674.最长连续递增序列

文章

代码随想录|0674.最长连续递增序列

思路

反而比上一题简单,连续序列意味着不需要遍历i之前的所有位置
只需要0nums[i]>nums[i-1]即可令dp[i]=dp[i-1]+1

代码

class Solution {
   public int findLengthOfLCIS(int[] nums) {
       int i, n;
       n = nums.length;
       int[] dp = new int[n];
       dp[0] = 1;
       int res = 1;
       for (i = 1; i < n; ++i) {
           if (nums[i] > nums[i - 1]) {
               dp[i] = dp[i - 1] + 1;
               res = res > dp[i] ? res :  dp[i];
           } else {
               dp[i] = 1;
           }
       }
       return res;
   }
}

718.最长重复子数组

文章

代码随想录|0718.最长重复子数组

思路

提示要用二维数组dp
dp[i][j]表示nums1的第i位为末尾的nums1的子数组和以nums2的第j位为末尾的nums2子数组中最长重复的长度,如果nums1[i]与nums2[j]相同则
d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 dp[i][j]=dp[i-1][j-1]+1 dp[i][j]=dp[i1][j1]+1
否则 d p [ i ] [ j ] = 0 dp[i][j]=0 dp[i][j]=0

代码

class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int res = 0;
        int i, j, m, n;
        m = nums1.length;
        n = nums2.length;
        int[][] dp = new int[m][n];
        // dp[0][0] = nums1[0] == nums2[0] ? 1 : 0;
        for (i = 0; i < m; ++i) {
            for (j = 0; j < n; ++j) {
                if (i > 0 && j > 0 && nums1[i] == nums2[j]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else if (nums1[i] == nums2[j]) {
                    dp[i][j] = 1;
                }
                res = res > dp[i][j] ? res : dp[i][j];
            }
        }
        return res;
    }
}

总结

基本上是N年前刷过的题,就像阔别已久的老友
欲买桂花同载酒!

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