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

leetcode 300 最长递增子序列

题目链接

300. 最长递增子序列 - 力扣(LeetCode)

做题过程

dp表示nums[i]作为结尾时,他的最长递增子序列。因此遍历序列两次。若是递增,则取dp[j]+1与 dp[i]的最大值;

解决方法

class Solution {
    public int lengthOfLIS(int[] nums) {
        if (nums.length <= 1) return nums.length;
        int[] dp = new int[nums.length];
        Arrays.fill(dp, 1);

        int result = 0;

        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[j] + 1, dp[i]);
                }
            }
            result = Math.max(dp[i], result);
        }

        return result;        
    }
}

leetcode 674 最长连续递增序列

题目链接

674. 最长连续递增序列 - 力扣(LeetCode)

做题过程

需要连续递增。因此只需要判断比前一个大。同时需要设置res来求最大的子序列。

解决方法

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        if (nums.length <= 1) return nums.length;
        int[] dp = new int[nums.length];
        Arrays.fill(dp, 1);

        int res = 0;

        for (int i = 1; i < nums.length; i++) {
            if (nums[i] > nums[i - 1]) {
                dp[i] = dp[i - 1] + 1;
            }
            res = Math.max(res, dp[i]);
        }
        return res;
    }
}

leetcode 718 最长重复子数组

题目链接

718. 最长重复子数组 - 力扣(LeetCode)

做题过程

dp需要一个二维数组。表示nums[i]与nums[j]结尾时,最大重复子数组。其余与前几道题相同。

解决方法

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

你可能感兴趣的:(算法)