您现在的位置是:首页 >其他 >代码随想录算法训练营第五十二天|300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组网站首页其他

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

禹泽. 2024-10-07 12:01:05
简介代码随想录算法训练营第五十二天|300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

目录

LeeCode 300.最长递增子序列 

LeeCode 674. 最长连续递增序列 

LeeCode 718. 最长重复子数组  


LeeCode 300.最长递增子序列 

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

动归五部曲:

1.确定dp数组及下标含义: dp[i]: i 之前包括 i 的以 nums[i] 结尾的最长递增子序列的长度;

2.确定递推公式:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);

3.dp数组如何初始化:dp[i] = 1;

4.确定遍历顺序:从前到后遍历;

5.举例递推dp数组;

代码:

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
    	if (nums.size() <= 1) return nums.size();
		vector<int> dp(nums.size(), 1);
		int result = 0;
		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);
			}
			if (dp[i] > result) result = dp[i];
		} 
        return result;
    }
};

时间复杂度:O(n²)                                           空间复杂度:O(n)


LeeCode 674. 最长连续递增序列 

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

动归五部曲:

1.确定dp数组及下标含义: dp[i]:以下标 i 结尾的连续递增子序列的长度;

2.确定递推公式:dp[i] =dp[i - 1] + 1;

3.dp数组如何初始化:dp[i] = 1;

4.确定遍历顺序:从前到后遍历;

5.举例递推dp数组;

代码:

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
    	if (nums.size() == 0) return 0;
    	int result = 1;
    	vector<int> dp(nums.size(), 1);
    	for (int i = 1; i < nums.size(); i++) {
    		if (nums[i] > nums[i - 1]) dp[i] = dp[i - 1] + 1;
    		if (dp[i] > result) result = dp[i];
		}
        return result;
    }
};

时间复杂度:O(n)                                           空间复杂度:O(n)


LeeCode 718. 最长重复子数组  

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

动归五部曲:

1.确定dp数组及下标含义: dp[i][j]:以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组的长度;

2.确定递推公式:if(A[i - 1] == B[i - 1])  dp[i][j] = dp[i - 1][j - 1] + 1;

3.dp数组如何初始化:dp[i][0] = 0, dp[0][j] = 0;

4.确定遍历顺序:外层for循环遍历A,内层for循环遍历B;

5.举例递推dp数组;

代码:

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
    	vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
    	int result = 0;
    	for (int i = 1; i <= nums1.size(); i++) {
    		for (int j = 1; j <= nums2.size(); j++) {
    			if (nums1[i - 1] == nums2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
    			if (dp[i][j] > result) result = dp[i][j];
			}
		}
        return result;
    }
};

时间复杂度:O(n x m) (n 为A长度,m为B长度)              空间复杂度:O(n x m)

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。