【代码随想录刷题记录】 300.最长递增子序列 、 674. 最长连续递增序列 、718. 最长重复子数组

300.最长递增子序列

1、题目
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/

2、代码

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        if(nums.size() <= 1) return nums.size();
        int result = 0;
        //dp数组和初始化
        vector<int> dp(nums.size(), 1);
        //遍历
        for(int i = 1; i < nums.size(); i++){
            for(int j = 0; j < i; j++){
                if(nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
            }
            result = max(result, dp[i]);
        }
        return result;
    }
};

3、小结
使用dp数组定义为以i结尾的递增子序列的最大长度,方便下一步的比较工作。

674. 最长连续递增序列

1、题目
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

题目链接:https://leetcode.cn/problems/longest-continuous-increasing-subsequence/

2、代码

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        if(nums.size() <= 1) return nums.size();
        int result = 0;

        //dp数组
        vector<int> dp(nums.size(), 1);

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

3、小结
与上一题的代码类似,但需要注意的是该题求得是连续得子序列,所以不需要进行内层的循环,直接比较nums[i-1]即可。

718. 最长重复子数组

1、题目
给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。

题目链接:https://leetcode.cn/problems/maximum-length-of-repeated-subarray/

2、代码

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        if(nums1.size() == 0 || nums2.size() == 0) return 0;
        int result = 0;
        //定义及初始化dp数组
        vector<vector<int>> dp(nums1.size(), vector<int>(nums2.size(), 0));
        for(int i = 0; i < nums1.size(); i++){
            if(nums1[i] == nums2[0]) dp[i][0] = 1;
            result = max(result, dp[i][0]);
        }
        for(int j = 0; j < nums2.size(); j++){
            if(nums2[j] == nums1[0]) dp[0][j] = 1;
            result = max(result, dp[0][j]);
        }
        for(int i = 1; i < nums1.size(); i++){
            for(int j = 1; j < nums2.size(); j++){
                if(nums1[i] == nums2[j]) dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1);
                result = max(result, dp[i][j]);
            }
        }
        return result;

    }
};

3、小结
dp数组表示nums1以i结尾的以及nums2以j结尾的数组的最长重复子序列,但需要注意初始化过程以及resul的遍历情况,避免漏掉部分情况。

你可能感兴趣的:(算法,数据结构)