1.动态规划O(n^2)
参考:https://blog.youkuaiyun.com/maotianyi941005/article/details/81330389
int lengthOfLIS(vector<int>& nums) {
vector<int> maxlis(nums.size(),1);
int len = nums.size();
int lisNum = 1;
int i,j;
if(len == 0 || len == 1) return len;
for(i = 1;i < len; i++) {
for (j = 0; j < i; j++)
{
if (nums[i] > nums[j]) maxlis[i] = max(maxlis[j] + 1, maxlis[i]);
}
if (maxlis[i] > lisNum) lisNum = maxlis[i];
}
return lisNum;
}
状态转移方程:
maxlis[i] = max(maxlis[j] + 1) if (nums[j] < nums[i])
maxlis[i]表示以第i个元素结尾的最长递增序列长度。第i个元素nums[i]可以接到之前所有比他小的元素后面构成一个递增序列。我们从其中找出最长的序列然后接上就是以nums[i]结尾的最大长度了
2.二分+动态规划(没看太明白)
help[i]表示最长子序列长度为i时的最小的结尾num值
参考:
https://blog.youkuaiyun.com/maotianyi941005/article/details/81330389
新建一个数组help,依次遍历nums的元素,如果该元素大于help的最后一个元素,则将其加入help并放在最后,如果不是,则从help中找出第一个比他大的元素并用nums的这个元素替换掉它。最后得到的序列长度就是答案,但是help中保存的序列不是对应的最长子序列。