最长上升子序列 java_最长上升子序列 O(nlogn)解法 (java)
最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i
设dp[i]表示以i为结尾的最长递增子序列的长度,则状态转移方程为:
dp[i] = max{dp[j]+1}, 1<=j
这样简单的复杂度为O(n^2),其实还有更好的方法。
考虑两个数a[x]和a[y],x
按dp[t]=k来分类,只需保留dp[t]=k的所有a[t]中的最小值,设d[k]记录这个值,d[k]=min{a[t],dp[t]=k}。
这时注意到d的两个特点(重要):
1. d[k]在计算过程中单调不升;
2. d数组是有序的,d[1]
利用这两个性质,可以很方便的求解:
1. 设当前已求出的最长上升子序列的长度为len(初始时为1),每次读入一个新元素x:
2. 若x>d[len],则直接加入到d的末尾,且len++;(利用性质2)
否则,在d中二分查找,找到第一个比x小的数d[k],并d[k+1]=x,在这里x<=d[k+1]一定成立(性质1,2)。
/**
.最长递增子序列O(nlogn)算法:
.状态转移方程:f[i] = max{f[i],f[j]+1},1<=j
.分析:加入x=f[y],则x相对于y更有潜力。
.首先根据f[]值分类,记录满足f[t]=k的最小的值a[t],记d[k]=min{a[t]},f[t]=k.
. 1.发现d[k]在计算过程中单调不上升
. 2.d[1]
.解法:
.1. 设当前最长递增子序列为len,考虑元素a[i];
.2. 若d[len]
. 否则,在d[0-len]中二分查找,找到第一个比它小的元素d[k],并d[k+1]=a[i].()
.*/
/**
* Created by guojun on 2015/9/25.
*/
public class MaxUpSequence {
public static void main(String[] args) {
int[] a = new int[20];
for (int i = 0; i < a.length; i++) {
a[i] = (int)( Math.random() * 100);
System.out.print(a[i] + "\t");
}
System.out.println();
int[] b = new int[a.length];
b[0] = a[0];
int len = findSeq(a, b);
System.out.println(len);
}
public static int BinarySerch(int key, int[] a, int low, int high) {
while (low <= high) {
int mid = low + (high - low) / 2;
if (key > a[mid] && key < a[mid + 1]) {
return mid+1;
} else if (key > a[mid]) {
low = mid + 1;
} else if (key < a[mid]) {
high = mid - 1;
}
}
return 0;
}
public static int findSeq(int[] a, int[] b) {
if (a.length == 1) return 1;
int len = 1;
for (int i = 1; i < a.length; i++) {
if (a[i] > b[len - 1]) {
b[len] = a[i];
len++;
} else if (a[i] < b[len - 1]) {
int j = BinarySerch(a[i], b, 0, len - 1);
b[j] = a[i];
}
}
return len;
}
}
最长上升子序列 java_最长上升子序列 O(nlogn)解法 (java)相关推荐
- 数组的最长递减子序列java_最长递增/递减子序列
<编程之美>里有个题目是要求数组中最长递增子序列,在CSDN上看到的题目是数组中的最长递减子序列.题目如下: 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子 ...
- 最长递增子序列 java_最长递增子序列问题---动态规划
最长递增子序列问题是一个很基本.较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法.由于这个问题能运用学过的基本的算法分析和设计的方法与思想,能 ...
- 字典序最大子序列java_字典序最大的子序列
链接:https://www.nowcoder.com/acm/contest/84/A 来源:牛客网 题目描述 给定字符串s,s只包含小写字母,请求出字典序最大的子序列. 子序列:https://e ...
- 输出最长单调递增子序列java_动态规划实现最长单调递增子序列
1. 实验环境 操作系统:Mac 64 运行内存:16GB 编程语言:Java 编译环境:Eclipse 2. 题目要求 设计一个Ο(nlgn)时间的算法,求一个 n 个数的序列的最长单调递增子序列. ...
- 【动态规划】最长公共子序列与最长公共子串
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列
唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...
- 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用
2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...
- Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离
Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...
最新文章
- 让jquery easyui datagrid列支持绑定嵌套对象
- 信息系统开发平台OpenExpressApp - 数据权限
- python模块详解 time与date time
- ajax提交数据被截断的问题
- for ihs linux_Install WAS6.1+IHS for Linux(64bit)
- 笨办法学 Python · 续 练习 34:分析器
- Tomcat学习总结(17)—— Tomcat生产环境中域名访问和连接MySQL
- GitLab地域封锁,总监愤而辞职!苹果产品路线图曝光;CAT 0.1.0发布|极客头条...
- vue的table组件
- 电脑指定区域旋转_随州平板电脑无线管道潜望镜QV厂家_武汉天仪仪器
- 02 Python元组 字典 数据类型 if while for 迭代
- 在ubuntu 20.04 上 安装 onnxruntime CUDA
- 使用 tf.nn.dynamic_rnn 展开时间维度
- Windows Server 2016-Powershell之客户端加域
- 在线CAD看图网页版,一样可以快速查看CAD图纸
- 微信开放平台应用绑定
- JS实现文本的语音朗读
- java小游戏------Flappy Bird(飞翔的小鸟含源码)
- Cookie命名的由来
- “GANs”与“ODEs”:数学建模的终结?
热门文章
- 算术类型转换、整型提升
- c语言笔记:转义字符
- mq幂等mysql_膜拜!看完这篇你还不懂RocketMQ算我输
- python 不确定度_python机器学习-chapter2_16
- Spring MVC:The request sent by the client was syntactically incorrect
- python代做在哪找靠谱_比较靠谱的资产评估师考试去哪找
- java串口监听超时_从串口读取时如何实现read()的超时(C / C)
- 安装sqlserver2008,重新启动计算机不通过的解决办法
- numpy读取csv_Numpy——IO操作与数据处理
- arcgis中字段计算器利用python比较大小