子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
示例 1:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:
输入:nums = [0,1,0,3,2,3]
输出:4
示例 3:
输入:nums = [7,7,7,7,7,7,7]
输出:1
提示:
1 <= nums.length <= 2500
-104 <= nums[i] <= 104
一个裸题,关于最长上升子序列利用二分优化的,我们假设从左到右遍历不断更新一个数组,这个数组的元素来源于题目输入的nums,然后保证这个数组的元素不断递增,那么我们遍历的时候不断更新,
比如,一开始这个数组:为[1,4,5,8,9],然后遍历数组nums,如果nums[x]=6,我们去更新这个数组,因为这个数组的元素都是在位置x前面,不可能插入得到[1,4,5,6,8,9],只能根据贪心策略,去优化内容,变成
[1,4,5,6,9]。
AC代码
class Solution {
public:
int dp[2510];
int lengthOfLIS(vector<int>& nums) {
int len=0;
dp[0]=-1e5;
for(int i=0;i<nums.size();i++)
{
int l=0,r=len,fin=-1;
while(l<=r)
{
int mid=(l+r)/2;
if(dp[mid]<nums[i])
{
fin=mid;
l=mid+1;
}
else r=mid-1;
}
len=max(len,fin+1);
dp[fin+1]=nums[i];
}
return len;
}
};