76-最长上升子序列

给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。

说明

最长上升子序列的定义:
最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的。https://en.wikipedia.org/wiki/Longest_increasing_subsequence

样例

给出 [5,4,1,2,3],LIS 是 [1,2,3],返回 3
给出 [4,2,4,5,3,7],LIS 是 [2,4,5,7],返回 4

挑战

要求时间复杂度为O(n^2) 或者 O(nlogn)

标签

动态规划 LintCode 版权所有 二分法

思路

参见博客http://www.cnblogs.com/dartagnan/archive/2011/08/29/2158247.html,利用栈和二分查找。

这个算法其实已经不是DP了,有点像贪心。至于复杂度降低其实是因为这个算法里面用到了二分搜索。本来有N个数要处理是O(n),每次计算要查找N次还是O(n),一共就是O(n^2);现在搜索换成了O(logn)的二分搜索,总的复杂度就变为O(nlogn)了。

这个算法的具体操作如下(by RyanWang):

开一个栈,每次取栈顶元素top和读到的元素temp做比较,如果temp > top 则将temp入栈;如果temp < top则二分查找栈中的比temp大的第1个数,并用temp替换它。 最长序列长度即为栈的大小top。
这也是很好理解的,对于x和y,如果x < y且Stack[y] < Stack[x],用Stack[x]替换Stack[y],此时的最长序列长度没有改变但序列Q的''潜力''增大了。

举例:原序列为1,5,8,3,6,7
栈为1,5,8,此时读到3,用3替换5,得到1,3,8; 再读6,用6替换8,得到1,3,6;再读7,得到最终栈为1,3,6,7。最长递增子序列为长度4。

当出现1,5,8,2这种情况时,栈内最后的数是1,2,8不是正确的序列啊?难道错了?
分析一下,我们可以看出,虽然有些时候这样得不到正确的序列了,但最后算出来的个数是没错的,为什么呢?
想想,当temp>top时,总个数直接加1,这肯定没错;但当temp<top时呢? 这时temp肯定只是替换了栈里面的某一个元素,所以大小不变,就是说一个小于栈顶的元素加入时,总个数不变。这两种情况的分析可以看出,如果只求个数的话,这个算法比较高效。但如果要求打印出序列时,就只能用DP了。

code

class Solution {
public:/*** @param nums: The integer array* @return: The length of LIS (longest increasing subsequence)*/int longestIncreasingSubsequence(vector<int> nums) {// write your code hereint size = nums.size(), i = 0;vector<int> stack;if(size <= 0) {return 0;}stack.push_back(nums[0]);for(i=1; i<size; i++) {if(stack[stack.size()-1] < nums[i]) {stack.push_back(nums[i]);}else {int low = 0, high = stack.size()-1, mid = 0;while(low <= high) {mid = low + (high - low) / 2;if(nums[i] > stack[mid]) {low = mid + 1;}else {high = mid - 1;}}stack[low] = nums[i];}}return stack.size();}
};

转载于:https://www.cnblogs.com/libaoquan/p/7130544.html

lintcode-76-最长上升子序列相关推荐

  1. [csu/coj 1078]多个序列的最长公共子序列

    题意:给n个序列,同一个序列里面元素互不相同,求它们的最长公共子序列. 思路:任取一个序列,对于这个序列里面的两个数ai,aj(i<j),如果对于其它每一个序列,都出现过ai,aj,且ai在aj ...

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

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

  3. BZOJ3173:[TJOI2013]最长上升子序列(Splay)

    Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input 第一行一 ...

  4. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

    最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...

  5. [Swift]LeetCode673. 最长递增子序列的个数 | Number of Longest Increasing Subsequence

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  6. BZOJ 3173: [Tjoi2013]最长上升子序列

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1524  Solved: 797 [Submit][ ...

  7. POJ3450 Corporate Identity —— 后缀数组 最长公共子序列

    题目链接:https://vjudge.net/problem/POJ-3450 Corporate Identity Time Limit: 3000MS   Memory Limit: 65536 ...

  8. BZOJ3173 [TJOI2013]最长上升子序列

    题面: 3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2108  Solved: 1067 [Sub ...

  9. 最长递增子序列和网易去除最少使从左向右递增又递减问题

    (1)最长递增子序列问题 有两种方法:(1)动态规划方法(2)类似二分查找的方法O(nlogn) 动态规划方法: 以i结尾的序列的最长递增子序列和其[0, i - 1]"前缀"的最 ...

  10. [网络流24题] 最长递增子序列

    [网络流24题] 最长递增子序列 «问题描述: 给定正整数序列x1,..., xn. (1)计算其最长递增子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的递增子序列. (3)如果允 ...

最新文章

  1. 比Hadoop快至少10倍的物联网大数据平台,我把它开源了
  2. shell常用的基础命令
  3. capistranorb
  4. Qt Creator优化移动设备的应用程序
  5. HTTP_响应消息_响应行_状态码
  6. 面向中后台复杂场景的低代码实践思路
  7. Highcharts使用指南
  8. 如何把winform图片背景换成透明颜色_如何用photoshop更换图片背景颜色?
  9. android studio crashlytics,Crashlytics发现了一个无效的API密钥 – AndroidStudio构建
  10. proxmox 控制台无法连接_Proxmox VE 5的SPICE控制台和虚拟机声音设置
  11. malloc分配的内存空间是连续的吗
  12. 4种复制文件的方式性能比较
  13. 格雷码编码器 c语言,格雷码编码器功能实现
  14. dirent struct,在struct dirent可以文件名有非标准字符?
  15. ubantu 14.04重置密码
  16. 宝塔linux怎么安装asp网站,宝塔面板创建网站:宝塔linux面板添加网站详细教程...
  17. python中num函数是什么意思_如何理解python3函数中num的用法?
  18. 【马司机带带我】电话骚扰自动化及其对策
  19. Scrapy爬虫框架,爬取小说网的所有小说
  20. LTE学习笔记四:OFDM

热门文章

  1. 机器人改变生活利弊英语作文_左手建筑右手餐饮,机器人如何改变大众生活? 圆梦人感言...
  2. Python 语言程序设计(5-2)七段数码管程序编写设计
  3. python为运行为何出现乱码_python中文的显示乱码怎么办
  4. mybatis-plus对datetime返回去掉.0_0欧姆电阻到底有没有用?这12个作用说明其不可或缺...
  5. 怎么配置宝塔linux环境,宝塔面板linux怎么安装
  6. 学会python爬虫能发财么_python如何赚钱? python爬虫如何进阶? python就业? 如何快速入门python?...
  7. python主程序子程序_python子程序
  8. js 查看是否为空值
  9. 高中电子技术——电弧抑制电路
  10. PAT (Basic Level) Practice1015 德才论