码迷,mamicode.com
首页 > 其他好文 > 详细

128. Longest Consecutive Sequence

时间:2018-10-07 23:25:38      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:else   数组排序   div   int   hashset   通过   分析   public   图片   

一、题目

  1、审题

  技术分享图片

  2、分析

    给出一个无序数组,求数组中存在的最长连续的数字序列的个数。

 

二、解答

  1、思路: 

    方法一、

      将数组排序后统计连续数值序列的个数。

   public int longestConsecutive(int[] nums) {
    
        int len = nums.length;
        if(len < 2)
            return len;
        Arrays.sort(nums);
        int max = 1;
        int tmp = 1;
        for (int i = 1; i < len; i++) {
            if(nums[i] == nums[i-1])
                continue;
            if(nums[i]== nums[i-1] + 1) {
                tmp++;
                max = Math.max(tmp, max);
            }
            else
                tmp = 1;
            
        }
        return max;
    }

 

    方法二、

      通过创建一个 Map 存储当前值的连续序列个数。

      每次存入新值时,一定要更新此值的边界数值的 value。

    public int longestConsecutive2(int[] nums) {
        
        int res = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int n: nums) {
            if(!map.containsKey(n)) {
                
                int left = (map.containsKey(n - 1)) ? map.get(n - 1) : 0;
                int right = (map.containsKey(n + 1)) ? map.get(n + 1) : 0;
                
                int sum = left + right + 1;
                map.put(n, sum);
                
                res = Math.max(res, sum);
                
                // extend the length to the boundary(s) of the sequence
                map.put(n - left, sum);
                map.put(n + right, sum);
            }
            else 
                continue;
        }
        return res;
    }

 

  方法三、

    采用 Set 去重,而且可以直接在 Set 中查找向左向右延伸的连续数值的个数。

    public int longestConsecutive(int[] nums) {
        int len = nums.length;
        if(len < 2)
            return len;
        
        Set<Integer> set = new HashSet<>();
        for(Integer num: nums) 
            set.add(num);
        
        int max = 1;
        for(int num: nums) {
            if(set.remove(num)) {
                int val = num;
                int sum = 1;
                while(set.remove(val-1))
                    val--;
                sum += num - val;
                
                val = num;
                while(set.remove(val+1))
                    val++;
                sum += val - num;
                
                max = Math.max(max, sum);
            }
        }
        return max;
    }

 

128. Longest Consecutive Sequence

标签:else   数组排序   div   int   hashset   通过   分析   public   图片   

原文地址:https://www.cnblogs.com/skillking/p/9751853.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!