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; } }