class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n=nums.size();
vector<int> tail(n+1,0);
int k=0;
for(int i=0;i<n;i++)
{
if(k==0||nums[i]>tail[k])
//若大于tail结尾,则增加tail元素
{
tail[k+1]=nums[i];
k++;
continue;
}
//若num指针所指元素小于tail尾部元素,则进行二分查找,确定
插入位置
int l=1,r=k;
while(l<r)
{
int m=(l+r+1)>>1;
if(tail[m]>=nums[i])
{
r=m-1;
}
else
l=m;
}
if(tail[r]<nums[i])
//大于某个tail元素,插入其后或替换其后
{
tail[r+1]=min(tail[r+1],nums[i]);
}
else
//小于某个tail元素,替换之
{
tail[r]=nums[i];
}
}
return k;
}
};
复杂度O(NlogN)