LC 300.最长递增子序列
题目链接:LC 300.最长递增子序列
思路:用dp数组记录从开始到每个值的最长递增子序列的长度。将dp数组所有值初始化为1,更新第i个值时用前面所有的值对i进行更新,哪个大要哪个。
代码:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int result = 1;//最终结果
vector<int> dp(nums.size(), 1);//其中的值表示从数组开始到该位置对应的值的最长递增子序列长度
for(int i=1; i<dp.size(); i++){
for(int j=i-1; j>=0; j--){//通过之前的更新dp[i]
if(nums[i]>nums[j])dp[i] = max(dp[i], dp[j]+1);
}
result = max(result, dp[i]);
}
return result;
}
};
LC 674. 最长连续递增序列
题目链接:LC 674. 最长连续递增序列
思路:dp数组的更新与上一题相比更简单。
代码:
class Solution {
public:
//自己的思路
int findLengthOfLCIS(vector<int>& nums) {
int result = 1;//最终结果
int cur = 1;//每个连续递增序列的长度
for(int i=1; i<nums.size(); i++){
if(nums[i]>nums[i-1]){
cur++;
}
else{
result = max(result, cur);
cur = 1;
}
}
return max(result, cur);//若一直是递增的,那么result到最后不会更新,所以需要max
}
//强硬用dp
int findLengthOfLCIS(vector<int>& nums) {
int result = 1;
vector<int> dp(nums.size(), 1);
for(int i=1; i<dp.size(); i++){
if(nums[i]>nums[i-1])dp[i] = dp[i-1]+1;
result = max(result, dp[i]);
}
result = max(result, dp[nums.size()-1]);
return result;
}
};
LC 718. 最长重复子数组
题目链接:LC 718. 最长重复子数组
思路:用二维dp数组,横纵分别表示两个数组。dp数组中的值表示最长公共子数组的长度,更新是判断两个数组该位置的值是否相等,若相同就更新,更新规则是对[i-1][j-1]的位置的值加一(i,j位置的值相同,那么就看他上一个位置的值是否相同)。所以需要对第一行第一列的值进行初始化。
代码:
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
int result = 0;
vector<vector<int>> dp(nums1.size(), vector<int>(nums2.size(), 0));
for(int a=0; a<nums1.size(); a++){
if(nums1[a] == nums2[0]){
dp[a][0] = 1;
result = 1;
}
}
for(int b=0; b<nums2.size(); b++){
if(nums2[b] == nums1[0]){
dp[0][b] = 1;
result = 1;
}
}
for(int i=1; i<nums1.size(); i++){
for(int j=1; j<nums2.size(); j++){
if(nums1[i]==nums2[j]){
dp[i][j] = dp[i-1][j-1]+1;
result = max(result, dp[i][j]);
}
}
}
return result;
}
};