最长递增子序列【LIS】

基准时间限制:1 秒 空间限制:131072 KB 分值: 0难度:基础题

给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)

例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。

Input

第1行:1个数N,N为序列的长度(2 <= N <= 50000)

第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S[i] <= 10^9)

Output

输出最长递增子序列的长度。

Input示例

8

5

1

6

8

2

4

5

10

Output示例

5

问题链接1134 最长递增子序列

问题分析:典型的计算最长递增子序列的问题。

程序说明:如果采用时间复杂度为O(n*n)的程序,是会出现TLE的。需要使用时间复杂度为O(nlogn)的程序。


AC的C++程序如下:

[cpp]view plaincopy

#include 

usingnamespacestd;

constintN = 50000;

intstack[N+1], ps;

intmain()

{

intn, val;

while(cin >> n) {

ps = 0;

for(inti=1; i<=n; i++) {

cin >> val;

intleft=1, right=ps, mid;

while(left <= right) {

mid = (left + right) / 2;

if(val > stack[mid])

left = mid + 1;

else

right = mid - 1;

}

stack[left] = val;

ps = max(ps, left);

}

cout << ps << endl;

}

return0;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 使用数组len来记录前i个元素最长子序列的长度,因此len[i+1]=max{1,len[k]+1},arr[i+...
    fuel阅读 198评论 0 1
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,790评论 0 33
  • 分治策略 本文包括分治的基本概念二分查找快速排序归并排序找出伪币棋盘覆盖最大子数组 源码链接:https://gi...
    廖少少阅读 1,922评论 0 7
  • 自小就养成了一种追求近乎完美的习惯,不能说这是个不好的习惯,但是有点对自己苛刻。人是一个主观动物,感性与理性并存,...
    地中海的传说阅读 143评论 0 0
  • 虽然与你相恋的时间很晚,但却可以陪你走很久。 我的愿望不多,只希望余生都能有你在我身边。 亲爱的,你是我最想留住的...
    爱丽丝兔阅读 1,943评论 27 10