leetcode最长递增子序列问题
题目描写叙述:
给定一个数组,删除最少的元素,保证剩下的元素是递增有序的。
分析:
题目的意思是删除最少的元素。保证剩下的元素是递增有序的,事实上换一种方式想,就是寻找最长的递增有序序列。解法有非常多种,这里考虑用动态规划实现。
开辟一个额外的一维数组dp[]用来记录以每一个元素为结尾的最长子序列的长度。当然。还须要一个哈希表,用来保存最长子序列的元素。dp[i]表示以数组A[i]为结尾的最长子序列的长度。则不难得到例如以下的公式:
然后通过回溯哈希表把须要删除的元素删除就可以。
<span style="color:#000000;background-color: rgb(204, 204, 204);">public class Solution {
	ArrayList<Integer> minDelete(int A[]){
		ArrayList<Integer> res=new ArrayList<Integer>();
		HashMap<Integer, Integer> hash =new HashMap<Integer, Integer>();
		int dp[]=new int[A.length];//dp[i]记录以A[i]为结尾的最长递增子序列长度
		int count=0;
		int end=0;//最长递增子序列的最后一个元素
		for(int i=0;i<A.length;i++){
			dp[i]=1;
			for(int j=0;j<i;j++){
				if(A[i]>=A[j]){
					dp[i]=Math.max(dp[i], dp[j]+1);
					if(count<dp[i]){
						count=dp[i];
						hash.put(i, j);
						end=i;
					}
				}
			}
		}
		int k=A.length-1;
		while(k>=0){
			while(k>end){//增加须要被删除的元素
				res.add(A[k]);
				k--;
				}
			k--;
			if(hash.containsKey(end)){
				end=hash.get(end);
				}
				else
					end=-1;
		}
		return res;
	}
}</span>
Google了一下最长递增子序列,发现了一篇非常棒的博客,写得非常具体。
http://blog.csdn.net/joylnwang/article/details/6766317
并且该博客还给出了更加优化的解法,太棒了,这里mark一下。
leetcode最长递增子序列问题的更多相关文章
- Leetcode 673.最长递增子序列的个数
		
最长递增子序列的个数 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[ ...
 - Java实现 LeetCode 673 最长递增子序列的个数(递推)
		
673. 最长递增子序列的个数 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, ...
 - 【LeetCode】300.最长递增子序列——暴力递归(O(n^3)),动态规划(O(n^2)),动态规划+二分法(O(nlogn))
		
算法新手,刷力扣遇到这题,搞了半天终于搞懂了,来这记录一下,欢迎大家交流指点. 题目描述: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度. 子序列是由数组派生而来的序列,删除(或不删 ...
 - [Swift]LeetCode673. 最长递增子序列的个数 | Number of Longest Increasing Subsequence
		
Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...
 - 最长回文子序列LCS,最长递增子序列LIS及相互联系
		
最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...
 - (转载)最长递增子序列 O(NlogN)算法
		
原博文:传送门 最长递增子序列(Longest Increasing Subsequence) 下面我们简记为 LIS. 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则 ...
 - 最长公共子序列(LCS)和最长递增子序列(LIS)的求解
		
一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...
 - 最长递增子序列 O(NlogN)算法
		
转自:点击打开链接 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS. 排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个 ...
 - 51nod 1134 最长递增子序列
		
题目链接:51nod 1134 最长递增子序列 #include<cstdio> #include<cstring> #include<algorithm> usi ...
 
随机推荐
- (58)zabbix网络拓扑图配置network map
			
zabbix网络地图介绍 “zabbix network map”可以简单的理解为动态网络拓扑图,可以针对业务来配置zabbix map, 通过map可以了解应用的整体状况:服务器是否异常.网络是否有 ...
 - Gitlab仓库搭建及在Linux/windows中的免密使用
			
1. Gitlab简介 Gitlab:代码私有仓库,可以使用Git进行代码的管理. GitHub:公共仓库. GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭 ...
 - linux 04 CentOS安装
			
今天在Vmware上安装了CentOS6.5系统,下午首先把书上的安装过程看了一遍,实际进行操作时有些步骤不一样,经过查资料成功安装,说一下收获.选择自定义安装虚拟机,首先创建空白虚拟机,稍后编辑虚拟 ...
 - Web安全XSS、CSRF和SQL注入
			
SQL注入 SQL注入是以用户的输入作为sql语句的一部分,如后端接收到用户的请求数据后,不经过数据转义,就把数据拼接到SQL中执行,容易导致SQL的语义被篡改,即受到攻击了. 解决办法是对接收的数据 ...
 - cache支持三种pre-fetch方式:normal/pre-fetch1/pre-fetch2-way1/pre-fetch-way2
			
1.normal fetch ----fetch 1 cache line once 2. pre-fetch mode one ---- fetch 3 cache line once 3.pre ...
 - Python面向对象(约束,异常处理,md5加密)(五)
			
1. 类的约束 1. 写一个父类. 父类中的某个方法要抛出一个异常 NotImplementedError class Base: def login(self): raise NotImplemen ...
 - inode结构体
			
inode分为内存中的inode和文件系统中的inode,为了避免混淆,我们称前者为VFS inode, 而后者以EXT2为代表,我们称为Ext2 inod.这里说明的是VFS inode. 重要成员 ...
 - django基础(web框架,http协议,django安装)
			
学习Django之前我们先来看什么是OSI七层模型: 应用层 表示层 应用层(五层模型中把这三层合成一个应用层) http协议 会话层 传输层 提供端口对 ...
 - Service Broadcast简单音乐播放功能
			
在Activity上有两个ImageButton,分别控制播放/暂停.停止. @Override public void onCreate(Bundle savedInstanceState) ...
 - spring常用的注解
			
一.使用注解之前要开启自动扫描功能,其中base-package为需要扫描的包(含子包). <context:component-scan base-package="cn.test& ...