题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目描述:给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
解题思路
通过两次循环,在j
dp[i]代表从0到i递增子序列的长度
if(nums[i] > nums[j]) dp[i] = max(dp[i],dp[j]+1);
一个数就是长度为1的子序列,所以全部初始化为1.
从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。
class Solution {
public:
int lengthOfLIS(vector& nums) {
if(nums.size() == 1) return 1;
vector dp(nums.size(),1);
int result = 0;
for(int i=1;i nums[j]){
dp[i] = max(dp[i],dp[j]+1);
}
result = max(result,dp[i]);
}
}
return result;
}
};
总结:
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目描述:给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。
解题思路
dp[i]代表到nums[i]为止,最长的连续递增子序列
如果前一个前一个数小于后一个数,也就是递增的,我们就将当前dp+1,如果不小于,就不操作,也就是将其置1,初始化时已经置1,所以不用操作。
if(nums[i] > nums[i-1]) dp[i] = dp[i-1]+1;
全部初始化为1
正序遍历即可
class Solution {
public:
int findLengthOfLCIS(vector& nums) {
vector dp(nums.size(),1);
int result = 1;
for(int i=1;i nums[i-1]){
dp[i] = dp[i-1]+1;
}
result = max(result,dp[i]);
}
return result;
}
};
总结:
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目描述:给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。
解题思路
dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。 (特别注意: “以下标i - 1为结尾的A” 标明一定是 以A[i-1]为结尾的字符串 )
即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;
不相等就是0了,也就不用操作
全部初始化为0
先遍历数组1,或者数组2都可以。
class Solution {
public:
int findLength(vector& nums1, vector& nums2) {
vector> dp(nums1.size()+1,vector(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;
}
result = max(result,dp[i][j]);
}
}
return result;
}
};
总结: