算法——最长上升子序列(DP和二分)
给定一个无序的整数数组,找到其中最长上升子序列的长度。
输入: [10,9,2,5,3,7,101,18]
输出: 4
纯DP
解体思路:利用动态规划的方法,从一个方向遍历数组,每次获取以该位置为子序列结尾的长度。状态表示,利用数组f分别表示以该位结尾的最长上升子序列;状态转移,像前遍历,如果前者比后者小,则取二者最大长度,最后在加一,表示加上当前位。
PS:现在做dp的题自然而然能够想到闫氏DP分析法,首先想到如何用数组表示每个状态,再去思考怎么递推状态。
class Solution {
public int lengthOfLIS(int[] nums) {
int n = nums.length;
// 状态表示
int[] f = new int[n];
int res = 0;
for(int i = 0; i < n; i++) {
int cur = 0;
for(int j = i - 1; j >= 0; j--) {
if(nums[i] > nums[j]) {
// 获取前面最长子序列
cur = Math.max(f[j], cur);
}
}
// 状态转移
f[i] = cur + 1;
res = Math.max(f[i], res);
}
return res;
}
}
DP + 二分
解题思路:遍历数组,利用一个队列,保存遍历时当前的最长子序列。然后通过二分的方法,查找当前元素在队列中的位置,如果当前元素在队列元素的范围之内,则替换第一个大于等于它的元素,如果当前元素大于队列的最大元素,则直接将当前元素放在最后,同时最长子序列的值增加1。
- 为什么可以替换中间的值?
因为替换的是第一个大于等于它的值,这样既可以保持队列递增,还可以降低队列元素的值。
class Solution {
public int lengthOfLIS(int[] nums) {
int[] f = new int[nums.length];
int res = 0;
for(int num : nums) {
int l = 0, r = res;
while(l < r) {
int mid = l + r >> 1;
if(f[mid] >= num) {
r = mid;
} else {
l = mid + 1;
}
}
f[r] = num;
if(res == r) res ++;
}
return res;
}
}
算法——最长上升子序列(DP和二分)的更多相关文章
- POJ-2533最长上升子序列(DP+二分)(优化版)
Longest Ordered Subsequence Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 41944 Acc ...
- Bzoj 3173: [Tjoi2013]最长上升子序列 平衡树,Treap,二分,树的序遍历
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1183 Solved: 610[Submit][St ...
- 编程算法 - 最长上升子序列问题 代码(C)
最长上升子序列问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有一个长为n的数列a. 请求出这个序列中最长上升子序列的长度. 最长上升子序 ...
- 编程算法 - 最长公共子序列(LCS) 代码(C)
最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...
- LCS最长公共子序列~dp学习~4
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 Palindrome Time Limit: 4000/2000 MS (Java/Others ...
- Longest Ordered Subsequence POJ - 2533 最长上升子序列dp
题意:最长上升子序列nlogn写法 #include<iostream> #include<cstdio> #include<cstring> #include&l ...
- POJ 1458 最长公共子序列(dp)
POJ 1458 最长公共子序列 题目大意:给出两个字符串,求出这样的一 个最长的公共子序列的长度:子序列 中的每个字符都能在两个原串中找到, 而且每个字符的先后顺序和原串中的 先后顺序一致. Sam ...
- 动态规划算法——最长公共子序列问题(java实现)
已知序列X=(A,B,C,A,B,D,A)和序列Y=(B,A,D,B,A),求它们的最长公共子序列S. /* * LCSLength.java * Version 1.0.0 * Created on ...
- 【BZOJ2423】[HAOI2010]最长公共子序列 DP
[BZOJ2423][HAOI2010]最长公共子序列 Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...
随机推荐
- POSIX信号量与互斥锁实现生产者消费者模型
posix信号量 Link with -lpthread. sem_t *sem_open(const char *name, int oflag);//打开POSIX信号量 sem_t *sem_o ...
- 【python爬虫】用requests库模拟登陆人人网
说明:以前是selenium登陆取cookie的方法比较复杂,改用这个 """ 用requests库模拟登陆人人网 """ import r ...
- arm-linux 修改rootfs登录名和密码
1.保证文件系统busybox中已经配置了login登录功能. 2.修改命令行前缀名 (1)进到/etc/sysconfig,找到HOSTNAME文件,修改里面为想要的登录名后,之后再重新加载文件系统 ...
- txt文件覆盖恢复
1.txt文件恢复到之前保存的版本 2.电脑未重启 方式:如果你使用系统还原可以用"还原以前的版本"功能来轻松找回. 右击.txt文件-还原以前的版本-选择时间点-还原
- php 与 docker php-fpm 共存问题
需求: 本地一个 php7 的 php-fpm,现在需要运行 php5.2版本的程序, 服务器安装的 nginx 解析域名,碰见 php 文件交给 php5的 php-fpm; 注意: fastcgi ...
- PHP反序列化漏洞-CVE-2016-7124(绕过__wakeup)复现
前言 最近电脑也不知怎么了时不时断网而且我竟然找不出原因!!!很诡异.... 其他设备电脑都OK唯独我的电脑 时好时坏 我仿佛摸清了我电脑断网的时间段所以作息时间都改变了 今天12点多断网刷了会手 ...
- 思维导图MindManager的过滤主题功能如何使用
MindManager是一款多功能思维导图工具软件.但有的思维导图繁杂,用户只需要查看自己感兴趣的主题该怎么办呢?接下来,我就为大家详细介绍MindManager思维导图2020版的过滤主题功能,可以 ...
- 怎么绘制C语言选择和循环语句的思维导图
C语言是一门非常基础的计算机语言,是大部分本科学生的公共专业,在C语言的学习中,选择和循环语句是至关重要的部分,利用思维导图可以有效节约时间并加深知识点记忆. 接下来就为大家介绍一下我用iMindMa ...
- 攻克solo第五课(Mixolydian 音阶)
相对于独奏来说,我们已经说过了很多关于solo或独奏的乐理和技巧.那么这篇文章,笔者将使用guitar pro7软件来跟大家分享Mixolydian 音阶的演奏技巧,以及如何在学习Mixolydian ...
- appium 启动参数配置
启动配置参数,可以参照官网: http://appium.io/docs/en/writing-running-appium/caps/#general-capabilities from appiu ...