简单题DP O(n*n)时间复杂度,但是还是可以优化到O(nlogn)
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size()==0)
return 0;
else if(nums.size()==1)
return 1;
vector<int> dp(nums.size(),1);
int maxLength=1;
for(int i=nums.size()-2;i>=0;i--)
{
for(int j=i+1;j<nums.size();j++)
{
if(nums[j]>nums[i])
dp[i]=max(dp[i],1+dp[j]);
}
maxLength=max(maxLength,dp[i]);
}
return maxLength;
}
};
算法复杂度O(nlongn),最长递增子序列问题,解法就是如果num在res最大最小值范围内,则将其替换。如果res超越所有,那么就直接放在后面,长度增加1。
class Solution {
public:
// find pos in res 找到num应该插入的位置
int func(int left, int right, vector<int>& res, int num){
if (right-left<=1){
if (num<=res[left]){return left;}
else if(num>res[right]){return right+1;}
else{return right;}
}
int mid = (left+right)/2;
if (res[mid]<num){
return func(mid+1, right, res, num);
}
else{
return func(left, mid-1, res, num);
}
}
int lengthOfLIS(vector<int>& nums) {
if (nums.size()==0){return 0;}
vector<int> res; // [2,3,4,6]
res.push_back(nums[0]);
int maxlen = 1;
for(int i=1;i<nums.size();i++){
//for(int i=0;i<res.size();i++){cout<<res[i]<<" ";}
int pos = func(0, res.size()-1, res, nums[i]);
//cout<<endl<<pos<<endl;
if (pos==res.size()){
res.push_back(nums[i]);
}
else{
res[pos] = nums[i];
}
}
maxlen = maxlen>res.size()?maxlen:res.size();
return maxlen;
}
};