给你一个整数数组 nums
,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]
是数组 [0,3,1,6,2,2,7]
的
子序列
。
示例 1:
输入:nums = [10,9,2,5,3,7,101,18] 输出:4 解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
class Solution {
public:
int lengthOfLIS(vector<int>& nums)
{
int len = nums.size();
if(nums.size() == 0) return 0;
vector<int> dp(len,1);//为什么这里需要设置成1,0不行吗
dp[0] = 1;
for(int i = 1 ; i < len ; i++)
{
for(int j = 0 ; j < i ; j++)
{
if(nums[i] > nums[j])
{
dp[i] = max(dp[i],dp[j] + 1);
}
}
}
int res = 1;
for(int i = 0; i < len ; i++)
{
res = max(res,dp[i]);
}
return res;
}
};
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 l
和 r
(l < r
)确定,如果对于每个 l <= i < r
,都有 nums[i] < nums[i + 1]
,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]]
就是连续递增子序列。
示例 1:
输入:nums = [1,3,5,4,7] 输出:3 解释:最长连续递增序列是 [1,3,5], 长度为3。 尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums)
{
int len = nums.size();
if(len == 0) return 0;
vector<int> dp(len+1,1);
for(int i = 1; i < len ; i++)
{
if(nums[i] > nums[i-1])
{
dp[i] = dp[i-1]+1;
}
}
int res = 1;
for(auto i : dp)
{
res = max(res,i);
}
return res;
}
};
给两个整数数组 nums1
和 nums2
,返回 两个数组中 公共的 、长度最长的子数组的长度 。
示例 1:
输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7] 输出:3 解释:长度最长的公共子数组是 [3,2,1] 。
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2)
{
int len1 = nums1.size();
int len2 = nums2.size();
vector<vector<int>> dp(len1 + 1,vector<int>(len2 + 1 ,0));
int res = 0;
for(int i = 1; i <= len1 ; i++)
{
for(int j = 1 ; j <= len2 ; j++)
{
if(nums1[i-1] == nums2[j-1])
{
dp[i][j] = dp[i-1][j-1] + 1;
}
if(dp[i][j] > res)
{
res = dp[i][j];
}
}
}
return res;
}
};