NC91 最长递增子序列
这道题n的范围是1e5,因此不能使用常规的dp[i],表示以i结尾的最大的子序列,因为这个时间复杂度是n方级别。因此要换一种算法。

贪心+二分,时间复杂度为O(nlogn)

下面说说贪心+二分的解法,举例说明基本思路,假设数组arr为[2, 3, 1, 2, 3],vec数组里面存放递增子序列,maxLen数组里存放以元素i结尾的最大递增子序列长度,那么遍历数组arr并执行如下更新规则:

初始情况下,vec为[2],maxLen[1]
接下来遇到3,由于vec最后一个元素小于3,直接更新,vec为[2,3],maxLen[1,2]
接下来遇到1,由于vec最后的元素大于1, 我们在vec中查找大于等于1的第一个元素的下标,并用1替换之,此时vec为[1,3], maxLen[1,2,1]
接下来遇到2,由于vec最后的元素大于2,我们在vec中查找大于等于2的第一个元素的下标,并用2替换之,此时vec为[1,2], maxLen[1,2,1,2]
接下来遇到3,由于vec最后一个元素小于3,直接更新,vec为[1,2,3],maxLen为[1,2,1,2,3]
此时vec的大小就是整个序列中最长递增子序列的长度(但是vec不一定是本题的最终解)

假设我们原始数组是arr1,得到的maxLen为[1,2,3,1,3],最终输出结果为res(字典序最小的最长递增子序列),res的最后一个元素在arr1中位置无庸置疑是maxLen[i]==3对应的下标,那么到底是arr1[2]还是arr1[4]呢?如果是arr1[2],那么arr1[2]<arr1[4],则maxLen[4]==4,与已知条件相悖。因此我们应该取arr1[4]放在res的最后一个位置。

上代码:

class Solution {public:vector<int> LIS(vector<int>& arr) {// write code herevector<int> vec;vector<int> Maxn;if(arr.size()==0) return vec;vec.push_back(arr[0]);Maxn.push_back(1);for(int i=1;i<arr.size();i++){if(arr[i]>vec[vec.size()-1]){vec.push_back(arr[i]);Maxn.push_back(vec.size());}else {int pos=lower_bound(vec.begin(),vec.end(),arr[i])-vec.begin();vec[pos]=arr[i];Maxn.push_back(pos+1);}}int len=vec.size();vector<int > v;for(int i=arr.size()-1;i>=0;i--){if(Maxn[i]==len){len--;v.push_back(arr[i]);}}reverse(v.begin(), v.end());return v;}
};

NC91 最长递增子序列相关推荐

  1. 最长递增子序列的两种解法

    以LeetCode-300为例: O(n^2)解法: dp数组表示以i结尾的最长递增子序列的长度 class Solution { public:int lengthOfLIS(vector<i ...

  2. 最长递增子序列问题的求解

    一, 最长递增子序列问题的描述 设L=<a1,a2,-,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,-,akm>,其中k1<k2 ...

  3. 编程之美2.16 最长递增子序列

          这道题目要求返回一个数字,这个数字代表一个数组中最长的递增子序列,当然,不要求这个序列是连续的,比如,有这样一个数组:{1, 3,5,7, 2, 9},那么这个数组的最长递增子序列就是5, ...

  4. 洛谷P2766-最长递增子序列问题

    chunlvxiong的博客 题目描述: 给定正整数序列x1,...,xn (1≤n≤500). 1.计算其最长递增子序列的长度s. 2.计算从给定的序列中最多可取出多少个长度为s的递增子序列. 3. ...

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

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

  6. 拦截导弹(最长递增子序列)

    题目描述:某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  7. Java输出数组中最长递增子序列的代码

    下面内容是关于Java输出数组中最长递增子序列的内容,希望对大伙有较大用途. package com.wzs;import java.util.ArrayList; import java.util. ...

  8. 动态规划(最长递增子序列)---最长递增子序列

    最长递增子序列 300. Longest Increasing Subsequence (Medium) 题目描述:   给定一个数组,找到它的最长递增子序列 思路分析:   动态规划思想,定义一个数 ...

  9. 112. Leetcode 673. 最长递增子序列的个数 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i]表示以nums[i]结尾的数组最长递增子序列的长度, count数组, count[i]记 录以nums[i]结尾的数组,最长递增子序列的个数. ...

最新文章

  1. 串口通信模块2:串口通信编程基础(打开、配置)
  2. 源码解读_Go Map源码解读之Map迭代
  3. Quick-Cocos2d-x初学者游戏教程(二) -------------------- Quick内部的代码结构及相应的原理...
  4. android view rotate,Android使用RotateImageView 旋转ImageView
  5. 关于tar无法解压缩问题
  6. SQLMAP参数中文解说
  7. Mac下安装Flink的local模式(flink-1.0.2)
  8. python打包成exe_python 程序打包成exe程序
  9. 零基础带你学习MySQL—查询数据库(二)
  10. [SQL Server]关于15517号错误的一点想法
  11. java用url创建imageview,Android中ImageView使用网络图片资源的方法
  12. [UWP]了解模板化控件(8):ItemsControl
  13. 笔记本测试屏幕的型号的软件,哪个软件可以检测到笔记本的型号
  14. 英语播客列表opml_Hanselminutes播客Feed列表
  15. matlab从mp4文件中提取音频,如何提取mp4视频中的音频文件 将视频转换为MP3音频...
  16. lattice planner
  17. docker容器化部署nginx前端项目
  18. 计算机应用研究被ei检索吗,SCI/EI检索的国内计算机期刊
  19. 信号发生器-电路与电子技术课程设计
  20. Python超详细基础入门教程

热门文章

  1. 农夫 狼 羊 白菜 java,农夫、狼、羊、白菜(回溯法求解)
  2. PopupWindow
  3. 2020互联网大厂职级对应薪资一览表。
  4. 得到app文稿导出_得到app学习笔记作为知识付费者,如何把所学内容快速输出?...
  5. killall 命令的用法
  6. CMD快捷键(不区分大小写)——更新中
  7. 严版数据结构(第一章)
  8. 二、zookeeper客户端使用和集群特性
  9. vscode之 wget下载文件报错:ERROR: cannot verify data.vision.ee.ethz.ch‘s certificate
  10. windows连接的蓝牙设备(如小爱同学),无法调节音量