博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
时间复杂度为O(nlogn)的LIS算法
阅读量:4574 次
发布时间:2019-06-08

本文共 1863 字,大约阅读时间需要 6 分钟。

时间复杂度为 n*logn的LIS算法是用一个stack维护一个最长递增子序列

如果存在 x < y 且  a[x] > a[y],那么我们可以用a[y]去替换a[x]
因为a[y]比较小,具有更大的潜力,使得后面的元素和它成为更长的递增序列
如例子: a[] = {1,4,8,3,6};
我们用一个stack st保存当前的最长递增子序列,top = 0;
很明显,初始化时st[top] = 1;
之后随着i循环变量的递增,如果
a[i] > st[top] , 那么 st[++top] = a[i]. 很显然top+1就是当前最长递增子序列的长度
这样子判断的时间复杂度是O(1),
为什么可以这样子判断???
因为st保存的是当前的最长递增子序列,所以如果a[i] > st[top] 那么a[i]可以加入st中
从而形成更长的最长递增子序列。
那么可能会有想法是,如果数据是1 5 3 4,很明显,最长递增子序列是1 3 4,
但是根据上面的想法是 1 5 形成最长递增子序列。
 
别担心
下面介绍 当  a[i] < st[top]时的处理方法
上面我们说过, 如果存在x < y 且 a[x] > a[y] 我们可以使用a[y]去替换a[x]
因为a[y] 具有更大的潜力,使得后面的元素和它成为更长的递增序列。
所以当 a[i] < st[top]时, 显然 st中的元素就是a[x],而a[i]就是a[y]
我们在st中使用二分查找找到第一个大于等于a[i]的元素,然后用a[i]去替换它
比如 st = 1 , 4 , 8时
a[i] = 3,
我们可以用a[i]去替换4,从而在不影响结果的前提下,减少时间复杂度
 
 
题目uva10534
给定一个一组数字,要我们求这样一个序列
在序列的左边是递增的,右边是递减的,且递增和递减的个数要是一样的
思路:分别从两边进行最长递增子序列的dp,
    dp1是从下标 0 -> n-1   进行dp    
    dp2是从下标 n-1 -> 0   进行dp
    所以 ans = max{ min(dp1[i]-1, dp2[i]-1)+1, 0<=i<n };
    但是题目的数据有1w,O(N*N)的算法是不行的,
    所以要用nlogn的算法
 
1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 using namespace std;13 typedef long long LL;14 const int INF = 1<<30;15 const int N = 10000 + 10;16 int min(const int &a, const int &b)17 {18 return a < b ? a :b;19 }20 int max(const int &a, const int &b)21 {22 return a < b ? b : a;23 }24 int st[N];25 int top;26 void LIS(int *a, int n, int *dp)27 {28 int i,j;29 top = 0;30 st[top] = a[0];31 for(i=1; i
st[top])34 {35 st[++top] = a[i];36 dp[i] = top +1 ;37 }38 else39 {40 int low = 0, high = top;41 while(low <= high)42 {43 int mid = (low + high) >> 1;44 if(st[mid]
View Code

 

 

 

转载于:https://www.cnblogs.com/justPassBy/p/4435767.html

你可能感兴趣的文章
第十三章、MYSQL常用操作
查看>>
FreeRTOS 二值信号量,互斥信号量,递归互斥信号量
查看>>
$POJ2893$ $M \times N$ $Puzzle$
查看>>
[android] 编译报错:Out of memory error
查看>>
【网络流24题】骑士共存问题(最大流)
查看>>
love2d角度,方向以及旋转
查看>>
win 运行
查看>>
12.2 VUE学习之-if判断,实践加减input里的值
查看>>
雪碧图元素自适应--CSS黑魔法
查看>>
Android连接网络打印机,jSocket连接网络打印机
查看>>
C++ Primer
查看>>
[转]Android OpenGL ES 开发教程 从入门到精通
查看>>
ODAC(V9.5.15) 学习笔记(三)TOraSession(3)
查看>>
delphi Table切换控件顺序问题
查看>>
校准仪开发项目日志
查看>>
IDEA 快捷键
查看>>
linux应用程序地址布局,王明学learn
查看>>
10.【nuxt起步】-引用mintui
查看>>
阿里云+wordpress搭建个人博客
查看>>
HDU 2222 Keywords Search (AC自动机)
查看>>