
AcWing 896. 最长上升子序列 II 【贪心+二分】
发布日期:2021-05-07 08:50:09
浏览次数:25
分类:精选文章
本文共 855 字,大约阅读时间需要 2 分钟。
hello大家好,欢迎大家访问 林深时不见鹿 的博客,算法小白,记录学习的点滴日常,致力于通俗易懂的题解,相遇即是上上签,如有不足,还请多多指教。
目录
1.题目
给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式
第一行包含整数N。第二行包含N个整数,表示完整序列。
输出格式
输出一个整数,表示最大长度。数据范围
1≤N≤100000, −109≤数列中的数≤109 输入样例: 7 3 1 2 1 8 5 6 输出样例: 42.思路 (贪心+二分) O(nlogn)
朴素版的LIS时间复杂度为O(n^2)会超时,因此这道题我们用贪心+二分来做。
先讲贪心思路: 我们定义一个数组q[],让q数组来存贮同一长度下的上升子序列结尾的最小值。因为如果我们可以接到一个更大的数后面,那么我们一定可以接到一个更小的数后面, 接到更小的数后面可以为我们留出更大的空间来接其他的数,使得数组的长度更长。可以证明q数组一定是单调上升的 最后q数组的长度就是答案 。 再讲二分: 如何更新q数组呢? 我们遍历原来的a数组,对于每个a[i],我们在q[]数组查找小于a[i]的最大的数x。找到以后我们将x的后一个数更新成a[i],因为x是小于a[i]的最大的数,那么x的后一个数一定是大于等于a[i]的。这个也好证明,如果x的后一个数也小于a[i],那么q数组中小于a[i]的的最大的数就不是x了而是x的后一个数了(数组q单调上升),这与我们二分的结果相反。3.代码
#include#include #include using namespace std;const int N=1e5+10;int a[N];int q[N];int main(){ int n; scanf("%d",&n); for(int i=0;i >1; if(q[mid]
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年05月13日 01时53分58秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
[源码分析] 消息队列 Kombu 之 启动过程
2019-03-06
Powershell中禁止执行脚本解决办法
2019-03-06
OO_Unit2 多线程电梯总结
2019-03-06
使用 TortoiseGit 时,报 Access denied 错误
2019-03-06
c++之程序流程控制
2019-03-06
《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
2019-03-06
看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
2019-03-07
Android DEX加固方案与原理
2019-03-07
iOS_Runtime3_动态添加方法
2019-03-07
我用wxPython搭建GUI量化系统之最小架构的运行
2019-03-07
selenium+python之切换窗口
2019-03-07
map[]和map.at()取值之间的区别
2019-03-08
VTK:可视化之RandomProbe
2019-03-09
Java时间
2019-03-09
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
2019-03-09
pair的用法
2019-03-09
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
2019-03-11
echarts 基本图表开发小结
2019-03-11