题目描述

给定数组arr,设长度为n,输出arr的最长递增子序列。(如果有多个答案,请输出其中字典序最小的)
示例1
输入

[2,1,5,3,6,4,8,9,7]

输出

[1,3,4,8,9]

示例2
输入

[1,2,8,6,4]

输出

[1,2,4]

说明

其最长递增子序列有3个,(1,2,8)、(1,2,6)、(1,2,4)其中第三个字典序最小,故答案为(1,2,4)

牛客链接:

https://www.nowcoder.com/practice/9cf027bf54714ad889d4f30ff0ae5481?tpId=188&&tqId=35305&rp=1&ru=/ta/job-code-high-week&qru=/ta/job-code-high-week/question-ranking

解题思路

用两步,第一步:先确定最长子序列长度
第二步:确定字典序最小的数组
贪心+二分法可以在O(nlogn)时间内确定每个元素为终点时最长递增子序列。但res不一定是最终顺序,res此时只有长度信息是准确的。
为了获取字典序最小。我们从后往前遍历,取每个位置上最后被替换的元素。

代码:

class Solution {public:/*** retrun the longest increasing subsequence* @param arr int整型vector the array* @return int整型vector*/vector<int> LIS(vector<int>& arr) {int len = arr.size();vector<int> res;vector<int> lens;lens.push_back(1);res.push_back(arr[0]);//用动态规划获得res的长度,此时res里存的数值不是正确的for(int i=1; i<len; i++) {if(arr[i] > res.back()) {res.push_back(arr[i]);lens.push_back(res.size());} else {//int relPos = lower_bound(res.begin(), res.end(), arr[i])-res.begin();//res[relPos] = arr[i];//lens.push_back(relPos);int j;for(j=res.size()-1; j>=0; j--) {if(arr[i] >= res[j]) break;}res[++j] = arr[i];lens.push_back(++j);}}//校正res里的数据for(int i=len-1,k=res.size()-1; k>=0; i--) {if(lens[i]-1 == k) {res[k] = arr[i];k--;}}return res;}
};

参考链接:

https://www.nowcoder.com/questionTerminal/9cf027bf54714ad889d4f30ff0ae5481

注意:
lower_bound(),upper_bound()函数的使用
贪心算法,用lens[i]记录当前下标的数字插入后的最长子序列大小

牛客刷题动态规划之最长递增子序列相关推荐

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

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

  2. 牛客刷题-Java面试题库【动态更新添加题目】(2023.06.19更新)

    讲在前面 ✨ 牛客刷题日记–理解为重中之重 刷题一方面是持续的了解到自己哪方面比较欠缺,另一方面也是从各大厂的面试题可以看出当前所需的技术栈的偏重点,持续的巩固基础和查漏补缺,一如代码深似海–学无止境 ...

  3. 牛客刷题日记(2021-12-8)

    牛客刷题日记(2021-12-8) 题目: 以下哪个接口的定义是正确的?( )interface B { void print() { } ;}interface B { static void pr ...

  4. 【Shell牛客刷题系列】SHELL5 打印空行的行号:一起学习grep命令搭配正则表达式的使用

    该系列是基于牛客Shell题库,针对具体题目进行查漏补缺,学习相应的命令. 刷题链接:牛客题霸-Shell篇. 该系列文章都放到专栏下,专栏链接为:<专栏:Linux>.欢迎关注专栏~ 本 ...

  5. 【牛客刷题专栏】0x27:JZ29 顺时针打印矩阵(C语言编程题)

    前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失. 个人刷题练习系列专栏:个人CSDN牛客刷题专栏. 题目来自:牛客/题库 / 在线编程 / 剑 ...

  6. 牛客刷题日记(2021-11-24)

    牛客刷题日记(2021-11-24) 题目: 下面程序的输出是:() String x="fmn"; x.toUpperCase(); String y=x.replace('f' ...

  7. 【字节面试题】牛客刷题偶遇字节后端笔试面经 撸它

    想要看更加舒服的排版.更加准时的推送 关注公众号"不太灵光的程序员" 每日八点有干货推送,微信随时解答你的疑问 牛客刷题偶遇 字节后端笔试0715 撸它 一共两道编程题. 1. 给 ...

  8. PYTHON 牛客刷题记录

    文章目录 一.牛客-简单类 1.HJ81 字符串字符匹配--SET使用 2.二维数组操作--map(),split()使用 3.HJ8 合并表记录--sorted().字典输出 4.HJ80 整型数组 ...

  9. 【Shell牛客刷题系列】SHELL4 输出第5行的内容:回顾head、tail命令和sed、awk命令的使用

    该系列是基于牛客Shell题库,针对具体题目进行查漏补缺,学习相应的命令. 刷题链接:牛客题霸-Shell篇. 该系列文章都放到专栏下,专栏链接为:<专栏:Linux>.欢迎关注专栏~ 本 ...

最新文章

  1. android studio 模拟器中文乱码
  2. NIO : selector、channel、buffer的实例
  3. 第一章 TensorFlow基础——python语法(一)
  4. 讲讲python使用xpath中遇到[Element a at 0x39a9a80到底是什么
  5. 剪贴板所有api函数
  6. Android版同步工具豌豆荚实测 电脑给手机按软件 截图
  7. 7-11 租用游艇问题 (15 分)(思路+详解+一步步分析+网格解决动态规划问题)Come boy!!!!
  8. zzulioj 1120: 最值交换
  9. Valgrind的使用方法
  10. Mybatis之使用注解开发CRUD
  11. Luogu2420 让我们异或吧
  12. Xshell使用教程——问答方式
  13. 自动将视频文件生成字幕的软件autosub安装及使用(支持英文、日语和法语)
  14. 无法打开计算机的组策略,本地组策略编辑器打不开?Win7本地组策略编辑器无法打开的解决方法...
  15. 怎样在电脑上上传图片_怎样上传图片或照片
  16. GO语言实现区块链Part6 Transactions 2
  17. pydub mp3转wav
  18. shiro中基于注解实现的权限认证过程
  19. 关于拯救者笔记本亮度调节按钮失灵修复方法
  20. switchyomega规则列表备份_详细资料|switchyomega设置教程详细介绍_234游戏网

热门文章

  1. AIEEE 2012场
  2. 【Python,PhCharm】Windows系统下载安装教程
  3. 单核多线程与多核多线程
  4. java交换二维数组行列_java二维数组行列
  5. 分支限界法 java_分支限界法装载问题java
  6. activiti扩展节点属性(在UserTask节点上添加附件上传功能)
  7. 如何在一个Latex文档中包含多个bib文件
  8. 2006年最新统计web2.0新鲜网站列表
  9. 苹果无线耳机使用方法_苹果官方:AirPods Pro出现这些问题,可免费更换
  10. 后浪推前浪,一浪比一浪高;来自老鸟们的分享