128. 最长连续序列

 

 方法一:

class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for(int num : nums) set.add(num);
        int res = 0;
        for(int num : nums) {
            int sum = 1;
            if(!set.contains(num-1)) {
                while(set.contains(++num)) {
                    sum++;
                }
            }
            res = Math.max(res,sum);
        }
        return res;
    }
}

方法二:

  • 用哈希表存储每个端点值对应连续区间的长度
  • 若数已在哈希表中:跳过不做处理
  • 若是新数加入:
    • 取出其左右相邻数已有的连续区间长度 left 和 right
    • 计算当前数的区间长度为:cur_length = left + right + 1
    • 根据 cur_length 更新最大长度 max_length 的值
    • 更新区间两端点的长度值
class Solution {
    public int longestConsecutive(int[] nums) {
        int n = nums.length;
        Map<Integer,Integer> map = new HashMap<>();
        int res = 0;
        for(int num : nums) {
            if(!map.containsKey(num)) {
                int l = map.getOrDefault(num-1,0);
                int r = map.getOrDefault(num+1,0);
                int len = l + r + 1;
                res = Math.max(res,len);
                map.put(num,-1); // 随便放一个值,表示已访问过
                map.put(num-l,len);
                map.put(num+r,len);
            }
        }
        return res;
    }
}

 

posted @ 2020-07-14 11:05  Sexyomaru  阅读(92)  评论(0编辑  收藏  举报