回顾dp
dp[i]:以i位置为结尾的,所有的子序列中,最长递增子序列的长度
状态转移方程:dp[i] = max(dp[j] + 1)
我们在考虑最长递增子序列的长度的时候,并不关心这个序列长什么样子
仅关心,这个序列的最后一个元素是谁。
贪心优化:
如果dp[x] == dp[y],并且nums[x] < nums[y],那么其实dp[y]并不需要留着了,仅需留着dp[x]。
因为如果一个数P,能接在nums[y]后面,也能接在nums[x]上。
存什么:所有长度为x的递增子序列,最后一个元素的最小值
存哪里:所有>= nums[i]的最小值
class Solution
{
public:
int lengthOfLIS(vector<int>& nums)
{
vector<int> res;//存储信息
res.push_back(nums[0]);
int n = nums.size();
for(int i = 1;i<n;i++)
{
if(nums[i] > res.back())
res.push_back(nums[i]);
else
{
//二分插入位置
int left = 0,right = res.size() - 1;
while(left < right)
{
int mid = (left + right) >> 1;
if(res[mid] < nums[i]) left = mid + 1;
else right = mid;
}
res[left] = nums[i];
}
}
return res.size();
}
};