随想录训练营Day52 | DP - - 300.最长递增子序列, 674. 最长连续递增序列

45 阅读1分钟

随想录训练营Day52 | DP - - 300.最长递增子序列, 674. 最长连续递增序列

标签: LeetCode闯关记


300.最长递增子序列

class Solution {
    public int lengthOfLIS(int[] nums) {
        int len = nums.length;
        int[] dp = new int[len];//dp[i]表示下标为[0,i]的最长严格递增子序列的长度
        Arrays.fill(dp,1);//初始化 子序列最小为1
        int res = 0;
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < i; j++) {
                if(nums[j] < nums[i]){
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                    }
                }
            if(dp[i] > res) {//细节 不另外for循环找dp【i】的最大值,而是在求dp【i]的时候进行比较
                res = dp[i];
            }
        }
       return res;
    }
}

674. 最长连续递增序列(很玄妙)

img_52_1.png

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        int[] dp = new int[nums.length];//dp[i]:以下标i为结尾的连续递增的子序列长度为dp[i]。
        int result = 1;
        //注意这里的定义,一定是以下标i为结尾,并不是说一定以下标0为起始位置。
        Arrays.fill(dp,1);
        for (int i = 1; i < nums.length; i++) {
            if(nums[i] > nums[i-1]){//cf:300.最长递增子序列
                dp[i] = dp[i-1] + 1;
            }
            result = result < dp[i]? dp[i]: result;//找dp【i】最大值
        }

        return result;
    }
}

718. 最长重复子数组

class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int len1 =nums1.length + 1;
        int len2 = nums2.length + 1;
        //dp[i][j]的定义为:以nums1[i - 1]和nums2[j - 1]为结尾的最长重复子数组长度
        //原因: 为了方便初始化,详见代码随想录
        int[][] dp = new int[len1][len2];
//        for (int i = 0; i < len1; i++) {
//            dp[i][0] = 0;
//        }
//        for (int i = 0; i < len2 ; i++) {
//            dp[0][i] = 0;
//        }
        int result = 0;
        for (int i = 1; i < len1; i++) {
            for (int j = 1; j < len2; j++) {
                if(nums1[i-1] == nums2[j-1]){
                    dp[i][j] = dp[i-1][j-1] + 1;//一起回退
                }
                if(result < dp[i][j]){
                    result = dp[i][j];
                }
                //System.out.println("i=" + i + " j= " + j + " dp[i][j]=" + dp[i][j]);
            }
        }
        return result;
    }
}