实现过程

定义已知序列数组为dp[];dp[1…8]=389,207,155,300,299,170,158,65

我们定义一个序列B,然后令 i = 1 to 8 逐个考察这个序列。
此外,我们用一个变量Len来记录现在最长算到多少了

1)首先,把d[1]有序地放到B里,令B[1] = 389,就是说当只有1一个数字389的时候,长度为1的LIS的最小末尾是389。这时Len=1。

2)然后,把d[2]有序地放到B里,d[2]=207<B[1]=389,所以令B[1] = 207,就是说长度为1的LIS的最小末尾是207,d[1]=389已经没用了。这时Len=1

3)接着,d[3] = 155<B[1]=207,所以令B[1]=d[3]=155,就是说长度为1的LIS的最小末尾是155,这时候B[1] = 155,Len=1

4)再来,d[4] = 300>B[1]=155,所以B[1+1]=B[2]=300,长度为2的LIS最小末尾是300,这时候B[1..2] = 155, 300,Len = 2

5)继续,d[5] = 299,d[5]>B[1]&&d[5]<B[2]。这时令B[2]=d[5]=299,用d[5]替换掉B[2],长度为2的LIS的最小末尾是299,B[1…2]=155,299,。Len=2。

6)第6个, d[6] = 170,和上一个一样B[2]=170,长度为2的LIS最小末尾是170,B[1…2]=155,170。Len=2。

7)第7个, d[7] =158,同样B[2]=158,B[1..2]=155,158。Len=2。

8)最后一个, d[8] = 65<B[1],所以令B[1]=65,这时B[1..2]=65,158,Len=2。

于是我们知道了LIS的长度为2。

注意B中存放的并不是LIS序列,而是存储的对应长度LIS的最小末尾。有了这个末尾,我们就可以一个一个地插入数据。

在B中插入数据是有序的,而且是进行替换而不需要挪动——也就是说,我们可以使用二分查找,将每一个数字的插入时间优化到O(logN)~~~~~于是算法的时间复杂度就降低到了O(NlogN)。

class Solution {
public:int lengthOfLIS(vector<int>& nums) {if(nums.size() == 0)return 0;int len=0;int i,t;vector<int>b;b.push_back(nums[0]);for( i=1;i<nums.size();i++){if(nums[i]>b[len]){b.push_back(nums[i]);len++;}else{t=lower_bound(b.begin(),b.end(),nums[i])-b.begin();b[t]=nums[i];}}return len+1;}
};

转载于:https://www.cnblogs.com/-xinxin/p/10585565.html

求最长上升子序列(Lis模板)相关推荐

  1. 求最长上升子序列——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; ...

  2. 最长上升子序列(LIS)长度

    转自:http://www.slyar.com/blog/poj-2533-cpp.html POJ 2533 Longest Ordered Subsequence 属于简单的经典的DP,求最长上升 ...

  3. 最长上升子序列(LIS),牛客刷题

    目录: 最长上升子序列(LIS) 1.模板(数据较小) 2.模板(数据较大) 牛客刷题 1. 牛客练习赛107A:如见青山 2.牛客小白月赛65A牛牛去购物 3.牛客小白月赛65B牛牛去购物 4.牛客 ...

  4. 最长上升子序列(LIS) nlogn解法

    文章目录 经典DP解法O(n^2) dp+二分法(O(nlogn)) 最长上升子序列LIS:Longest increasing subsequence 题目链接:Leetcode300. 最长递增子 ...

  5. Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离

    Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...

  6. 求最长递增子序列个数——C++

     声明:本文原题主要来自力扣,记录此博客主要是为自己学习总结,不做任何商业等活动! 一.下面是原题描述 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] ...

  7. 耐心排序之最长递增子序列(LIS)

    目录 一.问题引入 1.最长递增子序列(LIS) 2.问题分析 3.代码实现 4.问题思考 二.耐心排序 1.基本介绍 2.操作步骤 3.代码实现 三.俄罗斯套娃信封问题 1.题目描述 2.问题分析 ...

  8. 字符串求最长公共子序列(相似度计算)

    方法一: 思想 由大到小的截取并返回 保证如果返回肯定是返回最大的 短字符串的处方式:第一次for循环:递减 .第二次for循环 :截取该长度字符串的可行方案个数     然后截取 长字符串长度处理方 ...

  9. 吉首大学2019年程序设计竞赛(重现赛) 干物妹小埋(线段树求最长上升子序列)

    链接:https://ac.nowcoder.com/acm/contest/992/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

最新文章

  1. 第九章网络设备文件管理
  2. 优秀软件架构师成长之路
  3. 【1】Docker概述
  4. MongoDB(三):创建、更新和删除文档
  5. 设计网页字体css,CSS教程 :网页字体及字体大小的设计
  6. 大数据面试都问些什么?
  7. WebRTC sdp详解
  8. ssm框架整合springSecurity
  9. 基于Opencv实现的简易汉字识别
  10. matlab打开dat形式文件_将matlab中数据保存为txt或dat格式
  11. Test failed due to unrecognized service account for this product, please submit initial report for t
  12. 【bzoj1050】 旅行comf
  13. java集成极光推送实现Android的消息推送
  14. 并行计算系列-阿姆达尔定律(Amdahl‘s Law)
  15. Linux更改root用户名以提高安全性
  16. 分布式大矩阵SVD分解
  17. JAVA练习题:求水仙花数
  18. php json 解析 中文,php json 不能解析中文字符串???
  19. root精灵黑屏,刷机精灵解除root
  20. STM32-24位AD7799驱动之手册代码详解,支持模拟SPI和硬件SPI

热门文章

  1. 为Unity项目生成文档(一)
  2. Flash如何为文字描边
  3. InnoDB IO子系统介绍
  4. bootstrap 总结
  5. HiveServer2中使用jdbc客户端用户运行mapreduce
  6. java 字符串的编码与C#的区别
  7. 孪生网络图像相似度_孪生网络:使用双头神经网络进行元学习
  8. python生成范围内随机数_如何使用Python中的pareto分布在specyfic范围内生成随机数...
  9. ajax跨域为什么会失败,ajax跨域请求失败是怎么回事?
  10. Android实现蝴蝶动画,蝴蝶飞舞- (补间动画+逐帧动画)