给你一个整数数组 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 。
示例 2:
输入:nums = [0,1,0,3,2,3] 输出:4
示例 3:
输入:nums = [7,7,7,7,7,7,7] 输出:1
自制错误代码能过一半
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
//int cnt[1000]={1};
vector<int> cnt(1000,1);
//memset(cnt,m, sizeof(cnt));
int n=nums.size();
int ll=1;
for(int i=1;i<n;i++){
int p=0;
for(int j=0;j<i;j++){//从头到尾找最大的
if(nums[i]>nums[j])
{
p=1;
ll = max(ll,cnt[i]+cnt[j]);
cout << i<<"sss"<< j<< endl;
cout << cnt[i]<< cnt[j]<< endl;
// cout << ll << endl;
}
}
if(p==1)
cnt[i]=ll;
}
return ll;
}
};
动态规划(记忆化搜索)
class Solution {
public:
int lengthOfLIS(vector<int> &nums) {
int n = nums.size();
vector<int> f(n); //定义数组
for (int i = 0; i < n; i++) {
f[i] = 0;
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) { //成立
f[i] = max(f[i], f[j]);
}
}
//无论成不成都加 1
//自己本身就是 1
//好处是不会在之前的找最大循环中迭代影响
f[i]++;
}
return ranges::max(f);
}
};
贪心+二分查找 这个回头看,不好理解
class Solution {
public:
int lengthOfLIS(vector<int> &nums) {
vector<int> g;
for (int x : nums) {//遍历
auto it = ranges::lower_bound(g, x);
if (it == g.end()) {
g.push_back(x); // >=x 的 g[j] 不存在
} else {
*it = x;
}
}
return g.size();
}
};