1. 背
dp[i]表示有i个字符时最长递增子序列的最小末尾。长度为i的最长递增子序列可能有多个,但是最小末尾只能有一个。例如12378,长度为4的有1237和1238,但是最小的就是7。这么做的目的是为了能让每次更新dp的时候能用更高的效率。传统的dp手段每遍历一次就会遍历一次dp数组,但是用这种最小末尾的可以用二分的方式更新这个dp,因此复杂度就变成了nlogn
2. 答案
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n = static_cast<int>(nums.size());
vector<int>dp(n+1,INT_MAX);
dp[1] = nums[0];
for(int i=1;i<n;++i)
{
int index = lower_bound(dp.begin()+1, dp.end(),nums[i])-dp.begin();
dp[index] = nums[i];
}
int ret = 0;
for(int i=1;i<=n;++i)
{
if(INT_MAX==dp[i])
break;
++ret;
}
return ret;
}
};
class Solution {
public:
int lengthOfLIS(vector<int>& nums) { int n = static_cast<int>(nums.size());
vector<int>dp;
dp.push_back(nums[0]);
for(int i=1;i<n;++i)
{
if(dp.back()<nums[i])
dp.push_back(nums[i]);
else
{
auto it = lower_bound(dp.begin(), dp.end(), nums[i]);
*it = nums[i];
}
}
return dp.size();
}
};