原题链接:300. 最长递增子序列
动态规划
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n=nums.size();
vector<int> dp(n);
int res=1;
for(int i=0;i<n;i++)
{
dp[i]=1;
for(int j=0;j<i;j++)
{
if(nums[i]>nums[j] && (dp[j]+1>dp[i]))
{
dp[i]=dp[j]+1;
}
}
res=max(res,dp[i]);
}
return res;
}
};
贪心 + 二分查找
参考题解:动态规划 (包含O (N log N) 解法的状态定义以及解释)
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n=nums.size();
if(n<=1) return n;
vector<int> tail(n,0);
tail[0]=nums[0];
int end=0;
for(int i=1;i<n;i++)
{
int l=0,r=end+1;
while(l<r)
{
int mid=l+(r-l)/2;
if(tail[mid]<nums[i]) l=mid+1;
else r=mid;
}
tail[l]=nums[i];
if(l==end+1) end++;
}
return end+1;
}
};