题目:最长上升子序列 II

给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。

输入格式

第一行包含整数 N。

第二行包含 N个整数,表示完整序列。

输出格式

输出一个整数,表示最大长度。

数据范围

1≤N≤100000,
−10e9≤数列中的数≤10e9

输入样例:

7

3 1 2 1 8 5 6

输出样例:

4

问题解决

这个问题我用dp+二分法的方法来写。

一、 遍历a[i]将a[i]放入dp数组
1.1构造dp[i]数组:
  dp[i]为长度是i的上升子序列结尾元素。
  i:表示子序列的长度,取值范围是1~len,其中len表示目前最大的子序列长度。
1.2 将a[i]放入dp数组中
  规则为找到某个dp[j],使得a[i]>dp[j]&&a[i]<dp[j+1],
  找到后将dp[j+1]替换为a[i],更新len 判断len是否因dp数组的扩大而变大,len=max(len,j+1)。
...........................................................................................................................................................................................................
二 、在dp[1]和dp[len]之间寻找满足1.2条的位置
2.1 L端起点和r端终点的初始选择
  因为dp[i]的取值范围是1~len所以起始边界设置在两端之外L=0,r=len+1;
2.2 退出二分的条件
  当L+1==r时说明两个指针已经相邻,边界已经找到即可退出循环。
2.3 L端和r端分界线的判定条件
  L端都<a[i],r端都>=a[i],满足l端条件L=mid,否则r=mid。
2.4 采用r
  r即为1.2中的j+1。

我用的是手写二分法,主要参考链接如下:
https://www.bilibili.com/video/BV1d54y1q7k7?from=search&seid=14378360076371462119
大家也可以用upper_bound来取得r值。
3 总结
该程序时间复杂度为O(n*log n),可以解决n=1e5的规模的问题。

程序君‍:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
const int inf=1e9;
int main()
{
int a[N],dp[N],n; cin>>n;
for(int i=1;i<=n;i++) scanf("%d",&a[i]); int len=0;
for(int i=1;i<=n;i++)
{
int l=0,r=len+1;
while(l+1!=r)
{
int m=l+r>>1;
if(dp[m]<a[i])
{
l=m;
}
else
{
r=m;
}
}
dp[r]=a[i];
len=max(len,r);
} cout<<len;
return 0;
}

最长上升子序列 II 时间复杂度(nlogn)的更多相关文章

  1. 最长递增子序列 LIS 时间复杂度O(nlogn)的Java实现

    关于最长递增子序列时间复杂度O(n^2)的实现方法在博客http://blog.csdn.net/iniegang/article/details/47379873(最长递增子序列 Java实现)中已 ...

  2. HDU 5748 最长上升子序列的长度nlogn(固定尾部)

    Bellovin Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  3. 最长上升子序列(LIS)n2 nlogn算法解析

    题目描述 给定一个数列,包含N个整数,求这个序列的最长上升子序列. 例如 2 5 3 4 1 7 6 最长上升子序列为 4. 1.O(n2)算法解析 看到这个题,大家的直觉肯定都是要用动态规划来做,那 ...

  4. AcWing 896. 最长上升子序列 II

    #include<iostream> #include<algorithm> #include<vector> using namespace std; int m ...

  5. 最长上升子序列O(nlogn) 要强的T^T(2358)

    题目来源:http://www.fjutacm.com/Problem.jsp?pid=2358 要强的T^T TimeLimit:1000MS  MemoryLimit:65536K 64-bit ...

  6. BZOJ 3173 [Tjoi2013] 最长上升子序列 解题报告

    这个题感觉比较简单,但却比较容易想残.. 我不会用树状数组求这个原排列,于是我只好用线段树...毕竟 Gromah 果弱马. 我们可以直接依次求出原排列的元素,每次找到最小并且最靠右的那个元素,假设这 ...

  7. [ An Ac a Day ^_^ ] HDU 1257 基础dp 最长上升子序列

    最近两天在迎新 看来只能接着水题了…… 新生培训的任务分配 作为一个有担当的学长 自觉去选了动态规划…… 然后我觉得我可以开始水动态规划了…… 今天水一发最长上升子序列…… kuangbin有nlog ...

  8. LIS最长上升子序列O(n^2)与O(nlogn)的算法

    动态规划 最长上升子序列问题(LIS).给定n个整数,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他数的顺序不变).例如序列1, 6, 2, 3, 7, ...

  9. (转载)最长递增子序列 O(NlogN)算法

    原博文:传送门 最长递增子序列(Longest Increasing Subsequence) 下面我们简记为 LIS. 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则 ...

  10. 最长递增子序列 O(NlogN)算法

    转自:点击打开链接 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS. 排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个 ...

随机推荐

  1. mindxdl---common---db_handler.go

    // Copyright (c) 2021. Huawei Technologies Co., Ltd. All rights reserved.// Package common this file ...

  2. 并发bug之源(二)-有序性

    什么是有序性? 简单来说,假设你写了下面的程序: int a = 1; int b = 2; System.out.println(a); System.out.println(b); 但经过编译器/ ...

  3. JavaScript代码是怎么在浏览器里面运行起来的?

    JavaScript代码是怎么在浏览器里面运行的?下面简单探索一下 浏览器内核 浏览器内核(Rendering Engine),常见的叫法如:排版引擎.解释引擎.渲染引擎,现在流行称为浏览器内核. 浏 ...

  4. 模块/os/sys/json

    目录 内容概要 1.os模块 2.sys模块 3.json模块/实战 内容概要 os模块 sys模块 json模块/实战 1.os模块 # os模块主要是与我们的操作系统打交道 1.创建文件夹(目录) ...

  5. 一次MTU问题导致的RDS访问故障

    导语 VPN是一种通过公网连接两个或多个私网站点的专用网络,使得这些站点仿佛是通过专线连接在一起.IPSec是一套协议框架,用于保证数据传输的私密性,完整性,真实性.但是VPN网络经常会带来一些连通性 ...

  6. vue3 第二天vue响应式原理以及ref和reactive区别

    前言: 前天我们学了 ref 和 reactive ,提到了响应式数据和 Proxy ,那我们今天就来了解一下,vue3 的响应式 在了解之前,先复习一下之前 vue2 的响应式原理 vue2 的响应 ...

  7. Class文件解析

    1 准备工作 获取class文件byte[] public static byte[] getFileBytes(File file) { try (FileInputStream fileInput ...

  8. Python爬虫爬取彼岸网4K Picture

    深夜爬取4k图片 下载流程 定义page_text函数,对第一页地址发送get请求,因为页面数据在页面源代码都能查到,所以发送get 请求就ok!,注意:要进行编码格式设置,可以去源代码查看, 定义p ...

  9. Spring Security(7)

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 有时某些业务或者功能,需要在用户请求到来之前就进行一些判断或执行某些动作,就像在Servlet中的FilterChain过滤器所做的那样,Spr ...

  10. Java学习中实现的功能trick

    1.注册时,不用确认就可以知道用户名是否存在 技术:json+ajax 章节:javaweb->day22json&ajax 2.不常变化的导航栏.城市等信息存入数据库,通过redis做 ...