数组中的最长连续序列---dp实现

给定一个无序数组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));
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值