给定一个无序的整数数组,找到其中最长上升子序列的长度。
输入: [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和二分)的更多相关文章

  1. POJ-2533最长上升子序列(DP+二分)(优化版)

    Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 41944   Acc ...

  2. Bzoj 3173: [Tjoi2013]最长上升子序列 平衡树,Treap,二分,树的序遍历

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1183  Solved: 610[Submit][St ...

  3. 编程算法 - 最长上升子序列问题 代码(C)

    最长上升子序列问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有一个长为n的数列a. 请求出这个序列中最长上升子序列的长度. 最长上升子序 ...

  4. 编程算法 - 最长公共子序列(LCS) 代码(C)

    最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...

  5. LCS最长公共子序列~dp学习~4

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 Palindrome Time Limit: 4000/2000 MS (Java/Others ...

  6. Longest Ordered Subsequence POJ - 2533 最长上升子序列dp

    题意:最长上升子序列nlogn写法 #include<iostream> #include<cstdio> #include<cstring> #include&l ...

  7. POJ 1458 最长公共子序列(dp)

    POJ 1458 最长公共子序列 题目大意:给出两个字符串,求出这样的一 个最长的公共子序列的长度:子序列 中的每个字符都能在两个原串中找到, 而且每个字符的先后顺序和原串中的 先后顺序一致. Sam ...

  8. 动态规划算法——最长公共子序列问题(java实现)

    已知序列X=(A,B,C,A,B,D,A)和序列Y=(B,A,D,B,A),求它们的最长公共子序列S. /* * LCSLength.java * Version 1.0.0 * Created on ...

  9. 【BZOJ2423】[HAOI2010]最长公共子序列 DP

    [BZOJ2423][HAOI2010]最长公共子序列 Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...

随机推荐

  1. 如何实现Http请求报头的自动转发[应用篇]

    如今的应用部署逐渐向微服务化发展,导致一个完整的事务往往会跨越很多的应用或服务,出于分布式链路跟踪的需要,我们往往将从上游服务获得的跟踪请求报头无脑地向下游服务进行转发.本文介绍的这个名为Header ...

  2. 【python爬虫】用requests库模拟登陆人人网

    说明:以前是selenium登陆取cookie的方法比较复杂,改用这个 """ 用requests库模拟登陆人人网 """ import r ...

  3. Django 配置 Mysql

    先安装mysqlclient pip install mysqlclient sttings中的 DATABASES = { 'default': { 'ENGINE': 'django.db.bac ...

  4. rootfs如何取消登录超时

    一种简便的办法,在etc/inittab文件中,增加一行::respawn:-/bin/login.之后当登录超时后,还会在进入到登录界面,就不会出现登录超时后无法在登录的问题了. #first:ru ...

  5. 大数据和Hadoop平台介绍

    大数据和Hadoop平台介绍 定义 大数据是指其大小和复杂性无法通过现有常用的工具软件,以合理的成本,在可接受的时限内对其进行捕获.管理和处理的数据集.这些困难包括数据的收入.存储.搜索.共享.分析和 ...

  6. Monitor的扩展支持string的超时锁

    对Monitor的使用可以防止lock的时间过长并且可以设置其对应的超时时间达到对预期代码的一个控制,合理的使用timeout可以有助于程序的健壮性.但是对于不同的并发程序可能某些时候我们需要的粒度是 ...

  7. android下vulkan与opengles纹理互通

    先放demo源码地址:https://github.com/xxxzhou/aoce 06_mediaplayer 效果图: 主要几个点: 用ffmpeg打开rtmp流. 使用vulkan Compu ...

  8. bWAPP----iFrame Injection

    iFrame Injection 直接上代码 1 <div id="main"> 2 3 <h1>iFrame Injection</h1> 4 ...

  9. Django解决(1146, "Table 'd42.django_session' doesn't exist")方法

    执行 ./manage.py makemigrations sessions ./manage.py migrate sessions

  10. Guitar Pro编辑歌词教程

    吉他是常见的乐器之一,弹唱亦是音乐爱好者们最常见的表演方式.Guitar Pro(win系统)是吉他爱好者最常用的吉他谱制作软件,大家可以在该软件上创作自己的吉他谱.既然有了谱子,那自然是少不了歌词了 ...