constint N =2505;
class Solution {
public:int dp[N];intlengthOfLIS(vector<int>& nums){fill(dp, dp + N ,1);if(nums.size()==0)return0;int res=1;for(int i=1; i < nums.size(); i++){for(int j=0; j < i;j++){if(nums[i]> nums[j]) dp[i]=max(dp[j]+1, dp[i]);}
res=max(res, dp[i]);}return res;}};
方法2 二分
// q[i] 存长度为i的上升子序列,最后一个值最小的情况下是多少 q[i]严格单调递增// 每个数应该放到哪个q[i]后面constint N =2505;
class Solution {
public:int q[N];int n;intlengthOfLIS(vector<int>& nums){
n = nums.size();
q[0]=-2e4;int len =0;for(int i =0;i < n; i ++){int l =0, r = len;while(l < r){// 找一个最大的比当前数nums[i]小的数q[i]int m = l + r +1>>1;if(q[m]< nums[i]) l = m;else r = m -1;}
len =max(len, l +1);
q[r +1]= nums[i];// 把当前数接到后面去}return len;}};