LIS 的 n*log 算法 ———二分维护

upper_bound只会替换让留在数组里的最长递增子序列尽可能小
由于upper查出来的结果下标是那个可以插入这个值得最后一个元素
所以他会把大的数变成小的数

upper将可以替换成新元素的元素替换成更小的
将不能替换的元素 大的元素直接放在最后面
很神奇

你会发现 这个问题
通过一个二分就能解决
如何解决的呢
我们要在vector中维护一个递增序列
如何维护
那就是每当我们遍历过程中拿到一个元素
考虑如果这个元素比我们维护的最大递增数列的最大值还要大
就插在最后
如果比那个序列的最大值小
就需要在序列中
找到一个地方 放下这个值 使得我们整个序列的长度还是没变
但是能够替换某个元素使得这个序列中的某些元素变小
从而达到当我新来一个元素时能够尽可能插入进去
扩增LIS的长度的效果
因为在一个数组X中
X中的递增序列可能有多个
其中一定是最小的那个序列(对应元素尽可能的小)是LIS
比如在1 2 100 2 2中
LIS 1 2 2 2
那么 如果我们维护的是 1 2 100
此时就得不到最终的LIS 由于不是严格递增
所以我们要选择upperbound 要在维护的数列中选择
插入上界 跳过相等的元素 用2替换100使得序列尽可能长
而如果题目要求的是 严格递增
我们拿到一个新元素小于维护数列的最大元素时
就需要lowerbound插进去因为 我们要替换的是相等的元素
不过如果原来的序列中并没有与插入元素相等的元素
我们用lower_bound仍然会替换得到的序列会更小

**所以LIS问题
非严格递增 用upperbound维护 以为每次遇到一个相等的元素我们可以延长他相等的长度
从而增大LIS的长度 (注意虽然这里可以增大LSI的长度 但我们得到的并非是真正的LIS
我们只是得到了长度 比如对于1 2 3 4 5 2 2 这个序列 如果我们用uper维护
那么到我我们得到的序列是 1 2 3 4 5 继续处理我们得到了 1 2 2 2 5 虽然在原始中并不存在这个序列
但是他符合我们最长的要求 如果后面有更多的2 也就是可以把前面的大数全部覆盖
例如 我们得到了1 2 3 4 5 2 2 2 -〉我们得到最长的序列就是 1 2 2 2 2 假如原序列后面有个3
我们正好把他插入进去 得到名副其实的LIS 但如果我们不用upper维护 我们就得不到这个长度
所以虽然辅助数组中存的不是真正的LIS 但我们维护的策略是尽可能得到LIS的长度而非LIS
假如数列中最大值后面的元素数量不足以覆盖最大值 那么我们就算是LIS 依旧是在真正的LIS上进行操作
不会对真正的LIS长度造成影响
如果数列最大值后面的元素足够多了覆盖了最大值而且后面还能继续增加长度
那么我们这里的覆盖就是合理的 为了得到LIS的最大长度 这是我们的唯一选择

严格递增 用lowerbound插入比维护数组小的元素(
如上面的例子 我们用upper维护得到的是非严格递增的
那么用lower维护 遇到序列里已经存在的值 我们lower一下并没有任何实质性改变
所以用lower维护出来的一定是严格递增的最大值

时间复杂度O(nlogn)**

所以用二分去构造LIS的原因在于 二分插入的过程就是我们自己手工找出LIS的过程
遇到更大的值就插入LIS 否则就不断替换我们找到的数串以找到更长的LIS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]

【问题描述】[简单] 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回其层次遍历结果:[[3],[9,20],[15,7] ]【解答思路】 层次遍历 BFS 时…

爬虫入门-3.初识BeautifulSoup

一.安装BeautifulSoup BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.BeautifulSoup配合Request使用,能大大提高爬虫效率。 pip install BeautifulSoup 二.常见操作 from bs4 impor…

19.jsp生命周期

JSP 生命周期 理解JSP底层功能的关键就是去理解它们所遵守的生命周期。 JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet。 以下是JSP生命周期中所走过的几个阶段: 编译阶…

HDU-3998 Sequence LIS统计

题意 让我们在数串统计最长长度的LIS有多少个 每个LIS元素没有重叠 分析 这题可以用nlogn的LIS方法水过 就是每次我们更新找到的LIS长度的时候 就把当前位置下的元素标记 表示我们把它删掉了 不断地重复找LIS的过程 最后如果找到的长度小于我们最初找到的LIS长度 就退出循…

[剑指offer][JAVA]面试题第[32-3]题[从上到下打印二叉树 ][BFS]

【问题描述】[中等] 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。 例如: 给定二叉树: [3,9,20,null,null,15,7],3/ …

20.jsp语法

JSP 语法 本小节将会简单地介绍一下JSP开发中的基础语法。 脚本程序 脚本程序可以包含任意量的Java语句、变量、方法或表达式&#xff0c;只要它们在脚本语言中是有效的。 脚本程序的语法格式&#xff1a; <% 代码片段 %> 或者&#xff0c;您也可以编写与其等价的XM…

HDU-4282 A very hard mathematic problem 技巧枚举+二分

题意 xzyzx∗y∗zk( y>x&&z>1) 给我们这个等式让我们找出这里面有多少个不同的可行解 分析 表面上数据范围比较大 但由于k最大都在int范围内 由于后面还有一个x*y*z 于是这个式子的指数不会超过31 再来分析x和y 这里必定是一个y大x小 那么假如我们先枚举一个…

21.jsp指令

JSP 指令 JSP指令用来设置整个JSP页面相关的属性&#xff0c;如网页的编码方式和脚本语言。 语法格式如下&#xff1a; <% directive attribute"value" %> 指令可以有很多个属性&#xff0c;它们以键值对的形式存在&#xff0c;并用逗号隔开。 JSP中的三种…

基于docker创建的Jenkins,settings.xml文件放在哪里

如果运行容器时挂载目录如下 启动容器 docker run -itd -p 8080:8080 -p 50000:50000 --name jenkins --privilegedtrue --restartalways -v /home/jenkins_home:/var/jenkins_home jenkins/jenkins:latest 则需要将开发给的settings.xml文件中的localRepository路径改为容器中…

[Leedcode][JAVA][第139题][单词拆分][递归][记忆优化][动态规划]

【问题描述】[中等] 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明&#xff1a;拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1&#xff1a;输入: s …

HDU-4278 Faulty Odometer 数学递推 || 八进制

题意 这个里程表当走到3或8的时候就会跳过 给我们这个里程表上显示的数字 让我们求这个里程表的真实数据是多少 分析 由于 3 和 8 不存在 那么就相当于一个八进制数 但是这个八进制中3 是写作4 8是写作9 那么就好写了 也就是把数入的“特别八进制数”转化成一个十进制数 …

22.jsp动作元素

JSP 动作元素 与JSP指令元素不同的是&#xff0c;JSP动作元素在请求处理阶段起作用。JSP动作元素是用XML语法写成的。 利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。 动作元素只有一种语法&#xff0c;它符合XML标…

Centos7.5 lnmp+mongodb扩展

安装NginxYUM源中没有Nginx&#xff0c;我们需要增加一个nginx的源nginx.repo # vi /etc/yum.repos.d/nginx.repo 源文件的内容 [nginx] namenginx repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck0 enabled1 安装成功后&#xff0c;就可以直接…

[剑指offer][JAVA]面试题第[33]题[二叉搜索树的后序遍历][单调栈][递归分治]

【问题描述】[中等] 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true&#xff0c;否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树&#xff1a;5/ \2 6/ \1 3 示例 1&#xff1a;输入: [1,…

23.JSP 隐式对象

JSP 隐式对象 JSP隐式对象是JSP容器为每个页面提供的Java对象&#xff0c;开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。 JSP所支持的九大隐式对象&#xff1a; 对象描述requestHttpServletRequest 接口的实例responseHttpServletResponse 接口的…

Trie总结

Trie 树即为字典树 这个树可以把所有我们要在文本中所查询的前缀都记录下来 当我们拿到一个文本串 需要从里面找出所有前缀串的数目我们就可以用这个结构 拿着我们的文本到这个树里面走一走就得到有多少个前缀了 我们来看 当我们拿到一个前缀 不断地把这个前缀插入到树中 对每…

运用begin和end截取值

程序员在取值的时候会面临截取某一个值&#xff0c;前段时间在大佬那里学习了一个js取值&#xff0c;在<c:forEach items"${potcontestlist}" var"oldcontest1" begin"0" end"3">取值中如果需要截取某个值加begin先取第一个值的…

[程序员面试金典][JAVA][第02.01题][移除重复节点][Set][双指针]

【问题描述】[简单] 编写代码&#xff0c;移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入&#xff1a;[1, 2, 3, 3, 2, 1]输出&#xff1a;[1, 2, 3] 示例2:输入&#xff1a;[1, 1, 1, 1, 2]输出&#xff1a;[1, 2] 提示&#xff1a;链表长度在[0, 20000]范围…

24.JSP 客户端请求

JSP 客户端请求 当浏览器请求一个网页时&#xff0c;它会向网络服务器发送一系列不能被直接读取的信息&#xff0c;因为这些信息是作为HTTP信息头的一部分来传送的。您可以查阅HTTP协议来获得更多的信息。 下表列出了浏览器端信息头的一些重要内容&#xff0c;在以后的网络编…

25.二维码简介

1二维码概述 2二维码 3二维码 二维码概念 二维码发展历史 二维码分类 二维码优缺点 QR code