1. 最长上升子序列普通算法
    dp[n]表示以a[n]结尾的最长上升子序列长度
    显然有
    dp[n]=max(dp[n],dp[i]+1) 满足a[i]<a[n],1<=i<n
    实现过程时间复杂度为O(n^2)

2.O(nlogn)时间复杂度

思路是用数组lower保存最长上升子序列长度,对于当前元素a[i],若大于数组lower最后一个元素,则插入lower数组。否则,用二分在lower数组找到第一个大于a[i]的元素,并替换a[i]。整体上来说,用了贪心,因为每次的替换是让lower数组每个元素尽可能的小,这样的话就更有可能能在lower数组末尾插入元素。
关键的是,lower数组中保存的元素并不是真正的最长上升子序列,它表示的是最长上升子序列的长度。

那么问题来了?如何求最长上升子序列呢?
我们可以用一个pos2数组,记录一下数组a中的每个元素在lower数组中出现的位置。然后从数组a最后一个元素开始到第一个元素,寻找到最长上升子序列。
具体实现代码如下

int pos2[maxn],answer[maxn];
void LIS_quicker(int arrays[],int lower [],int n){//最长上升子序列nlogn算法+输出最长上升子序列lower[1]=arrays[1];int index=1;pos2[1]=1;for(int i=2;i<=n;i++) {if(arrays[i]>=lower[index]) {lower[++index]=arrays[i];pos2[i]=index;}else {int pos=upper_bound(lower+1,lower+index+1,arrays[i])-lower-1;lower[pos]=arrays[i];pos2[i]=pos;   //记录原数组中每个元素在 lower数组中出现的位置}}int maxx=999999; //从右往左打印,for(int i=n;i>=1;i--) {if(index==0) break;if(pos2[i]==index&&maxx>a[i]) { //先找第一个在lower数组index位置,再找第一个在lower数组index-1位置直到index=0answer[index]=i;//保存答案index-=1;maxx=a[i];}}}

最长上升子序列(O(nlogn))算法并输出最长上升子序列相关推荐

  1. 最长递增子序列 O(NlogN)算法

    最长递增子序列 O(NlogN)算法 今天回顾WOJ1398,发现了这个当时没有理解透彻的算法. 看了好久好久,现在终于想明白了. 试着把它写下来,让自己更明白. 最长递增子序列,Longest In ...

  2. c语言最长递增子序列nlogn,十月常见算法考题、最长递增子序列,Leetcode第300题最长上升子...

    十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子 十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子序列的变种,我没见过乔丹,今天詹姆斯就是我的神! @Aut ...

  3. 最长上升子序列 java_最长上升子序列 O(nlogn)解法 (java)

    最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i 设dp[i]表示以i为结尾的最长递增子序列的长度,则状态转移方程为: dp[i] = max{dp[j]+1} ...

  4. 最长连续子序列nlogn算法

    最长上升子序列(LIS)长度的O(nlogn)算法 标签: 算法search优化存储 2012-04-18 19:38 14031人阅读 评论(5) 收藏 举报  分类: 资料学习(15)  解题报告 ...

  5. 最长不下降子序列的O(n^2)算法和O(nlogn)算法

    转帖 最长不下降子序列的O(n^2)算法和O(nlogn)算法 最长不下降子序列(LIS:Longest Increasing Subsequence) //用句通俗的话说,我讲的很通俗易懂~~ 问题 ...

  6. 求最长上升子序列——LIS的O(nlogn)算法(二分)

    LIS的O(nlogn)算法(二分) 传送门:点我 O(n^2)解法:(n为4w,TLE) memset(dp,1,sizeof(dp)); int ans=-1; for(i=2; i<=n; ...

  7. 【训练题】航线设计 | 使用最长上升子序列(LIS)长度的O(nlogn)算法优化

    [问题描述] 有一个国家被一条河划分为南北两部分,在南岸和北岸总共有N对城镇,每一城镇在对岸都有唯一的友好城镇.任何两个城镇都没有相同的友好城镇.每一对友好城镇都希望有一条航线来往.于是他们向政府提出 ...

  8. 动态规划法求最大字段和时间复杂度_九章算法 | 动态规划:最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度. 在线评测地址:LintCode 领扣 说明 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低 ...

  9. 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...

最新文章

  1. 360浏览器卸载_如何卸载360浏览器,如何卸载360安全浏览器
  2. linux device注册
  3. 设置MySQL服务的字符集为uft8
  4. 0pp0r11如何更改语言_如何写才能避免重复率过高呢?
  5. 周志华教授签名新书免费送!豆瓣满分森林书破解AI实践难题
  6. 数组到指针的隐式转换
  7. python全排列_全排列算法python实现
  8. linux比较两台时间,两台linux机器时间同步
  9. 菜鸟程序员如何提升自己的潜在价值
  10. 51 nod 1405 树的距离之和
  11. 磁盘格式 mac android,MacDroid for mac(安卓手机数据传输助手)
  12. 2010年c语言上机题库,2010年全国计算机等级考试二级C语言上机题库
  13. 最新摸头GIF在线生成工具源码+实测可用
  14. php立方体相册源码,制作三维电子相册 3d立方体相册制作(flash相册制作)
  15. MATLAB聚类分析源代码
  16. 从北斗到Mate 50:星空中的中国式浪漫
  17. [树形dp][组合数] JZOJ P1794 保镖排队
  18. 滴答(DiDa)-客户端体验版上线了
  19. Windows与网络基础
  20. ubuntu提示“播放此文件需要MPEG-4-AAC解码器,H264解码器“

热门文章

  1. 多线程的实际应用场景
  2. HTTP中Get、Post、Put与Delete的区别
  3. 超详细 Servlet工作原理解析
  4. Maven笔记 - 第三章
  5. java中函数的应用。
  6. CNN网络模型大总结【持续更新中...】
  7. WEB安全之越权漏洞
  8. matlab语句xlim,matlab中设置坐标轴时xlim和axis有什么区别?
  9. oracle数据库impdp命令的使用方法
  10. ERLANG日期与时间