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

最长连续子序列 Longest Consecutive Sequence

时间:2018-11-26 02:18:42      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:gif   i++   ret   continue   tco   描述   分享   contains   ++   

2018-11-25 16:28:09

问题描述:

技术分享图片

问题求解:

方法一、如果不要求是线性时间的话,其实可以很直观的先排序在遍历一遍就可以得到答案,但是这里明确要求是O(n)的时间复杂度,那么就给了一个强烈的提示就是使用Hash来进行解决。方法一的思路很明确也很暴力,就是将所有的数字都保存到一个Hash表中,如果当前的数字是首个元素,那么就从他开始往后串连,得到以当前数字为首的最长连续序列,最后取max即可。时间复杂度是O(n),因为至多只会读取一个元素两次。

技术分享图片

    public int longestConsecutive(int[] nums) {
        if (nums == null || nums.length == 0) return 0;
        int res = 0;
        Set<Integer> set = new HashSet<>();
        for (int i : nums) set.add(i);
        for (int i : nums) {
            if (set.contains(i - 1)) continue;
            int len = 1;
            while (set.contains(i + 1)) {
                len++;
                i++;
            }
            res = Math.max(res, len);
        }
        return res;
    }

 

方法二、这个解法就难思考到一点,当然了依然是使用hash,只是这次保存的以当前为末尾的最长的序列的长度,之后如果重复读取则直接过滤掉,如果不是重复元素,那么就需要对其进行判断,如果左右有元素那么就会生成新的长度的序列,最后只需要遍历一遍hash即可。

技术分享图片

    public int longestConsecutive(int[] nums) {
        if (nums.length == 0 || nums.length == 1) return nums.length;
        int res = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            if (map.containsKey(num)) continue;
            int l = map.getOrDefault(num - 1, 0);
            int r = map.getOrDefault(num + 1, 0);
            int len = l + r + 1;
            if (l != 0 && r != 0) {
                map.put(num - l, len);
                map.put(num + r, len);
            }
            else if (l != 0) {
                map.put(num - l, len);
            }
            else if (r != 0) {
                map.put(num + r, len);
            }
            map.put(num, len);
        }
        for (int key : map.keySet()) res = Math.max(res, map.get(key));
        return res;
    }

 

技术分享图片

最长连续子序列 Longest Consecutive Sequence

标签:gif   i++   ret   continue   tco   描述   分享   contains   ++   

原文地址:https://www.cnblogs.com/TIMHY/p/10016058.html

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