128. 最長連續序列
阿新 • • 發佈:2020-07-14
方法一:
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; } }