数组中的最长连续序列---dp实现
2017-05-13 17:04
295 查看
给定一个无序数组arr,返回其中最长的连续序列的长度。
package com.lyf.dp; import java.util.HashMap; import java.util.Map; /** * Created by fangjiejie on 2017/5/13. */ public class MaxContinuousSequence { public static int getSequence(int arr[]){ int max=0;//max总是取遍历到当前位置时最大的序列长度 Map<Integer,Integer> map=new HashMap<>();//建立一个map,key为数值,value为该数值所在连续数列的长度 for(int i=0;i<arr.length;i++){ if(!map.containsKey(arr[i])){//map中不保存重复的数值 map.put(arr[i],1);//将,遍历到的数值放入map中,此时自创序列,长度为1 if(map.containsKey(arr[i]-1)){//如果存在左边相邻的数字,把这两个序列进行合并 max=Math.max(max,merge(map,arr[i]-1,arr[i])); } if(map.containsKey(arr[i]+1)){//如果存在右边相邻的数字,把这两个序列进行合并 max=Math.max(max,merge(map,arr[i],arr[i]+1)); } } } return max; } private static int merge(Map<Integer, Integer> map, int less, int more) { int length=0; int left=less-map.get(less)+1;//根据将要合并的less序列,找到这个序列里面最小的数值 int right=more+map.get(more)-1;//根据将要合并的more序列,找到这个序列里面最大的数值 length=right-left+1;//序列合并后的长度 map.put(left,length);//我们只需记录这个序列中的最小值的length map.put(right,length);//和这个序列中的最大值的length return length; } public static void main(String[] args) { int a[]={4,8,5,7,1,3,2}; System.out.println(getSequence(a)); } }
相关文章推荐
- 找出数组中最长的连续数字序列(JavaScript实现)
- JavaScript实现找出数组中最长的连续数字序列
- 编程实现:从字符中获取连续数组序列,如字符串"a1dl2iad9j3la5kudp7u9pn4blj8ap5u3e6ml9a"中可以得到的连续数字序列为1234556.【注】:只考虑一位,因此最长的数
- 最长连续子序列 DP
- 【DP】计算一个数组的最长递增子序列
- 数组的最长连续的序列
- 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱). 第二解
- 【DP】——求最长有序子序列(不要求连续)
- 获取一个数组中最长的连续的元素序列。例如,给定了[31,6,32,1,3,2],最长的连续的元素序列是[1,2,3],返回其长度3
- 程序员面试题目总结--数组(26)【最长连续序列】
- 求数组中最长的连续序列(Longest Consecutive Sequence )
- 最长上升子序列、最长下降子序列的DP算法由O(n^2)到O(nlogn)算法实现及其优化
- O(n)时间找出无序数组中最长的连续递增序列
- Post Tagged 【dp】最大子数组和(最大子序列和 | 连续子数组最大和)
- HDU 4745 Two Rabbits【非连续最长回文子序列,区间DP】
- POJ 2533 最长上升子序列长度的求解 DP实现
- POJ2479 Maximum sum 最长连续子序列[DP]
- poj1458(DP最长连续公共子序列)
- LCP数组的实现和最长公共连续子串