给定一个无序的整数数组,找到其中最长上升子序列的长度
注意「⼦序列」和「⼦串」这两个名词的区别,⼦串⼀定是连续的,⽽⼦序列不⼀定是连续的。
思路:dp[i]表示以i结尾的最长上升子序列的长度。遍历前面所有的数,对于小于nums[i]的nums[j],都可以有上升子序列长度:dp[i]=dp[j]+1;取最优的结果:dp[i]=max(dp[i],dp[j]+1)
int lengthOfLIS(vector<int>& nums) {
int n=nums.size();
vector<int>dp(n,1);
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
if(nums[i]>nums[j])
dp[i]=max(dp[i],dp[j]+1);
}
}
for(int i=1;i<n;i++){
dp[i]=max(dp[i-1],dp[i]);
}
return dp[n-1];
}
看到一个O(nlogn)的题解,利用了lower_bound函数
int lengthOfLIS(vector<int>& nums) {
vector<int>res;
for(int i=0;i<nums.size();i++){
auto it=lower_bound(res.begin(),res.end(),nums[i]);
if(it==res.end())res.push_back(nums[i]);
else *it=nums[i];
}
return res.size();
}