128. 最长连续序列
      
        给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度
请你设计并实现时间复杂度为 O(n) 的算法解决此问题
示例 1
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4],所以它的长度为 4
示例 2
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
Solution 1
第一次尝试,使用深度优先搜索解答,失败,超时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
   | class Solution {     public int longestConsecutive(int[] nums) {         Set<Integer> used;         List<Integer> temp;         int max = 0;         for (int num : nums) {             used = new HashSet<>(nums.length);             temp = new ArrayList<>();             temp.add(num);             used.add(num);             dfs(used, temp, nums);             if (temp.size() > max) {                 max = temp.size();             }             if (used.size() == nums.length) {                 break;             }         }         return max;     }
      private void dfs(Set<Integer> used, List<Integer> temp, int[] nums) {         for (int num : nums) {             if (!used.contains(num) && !temp.contains(num)) {                 boolean isContinues = false;                 for (Integer x : temp) {                     if (num == x + 1 || num == x - 1) {                         isContinues = true;                         break;                     }                 }                 if (isContinues) {                     temp.add(num);                     used.add(num);                     dfs(used, temp, nums);                 }             }         }     } }
  | 
 
Solution 2
官方解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
   | class Solution {     public int longestConsecutive(int[] nums) {         Set<Integer> numSet = new HashSet<>(nums.length);         for (int num : nums) {             numSet.add(num);         }
          int max = 0;         int len;         for (Integer num : numSet) {             if (!numSet.contains(num - 1)) {                 len = 1;
                  while (numSet.contains(num + 1)) {                     len++;                     num++;                 }
                  max = Math.max(len, max);             }         }         return max;     } }
  | 
 
- 执行用时:27 ms(击败 60.38% 使用 Java 的用户)
 
- 内存消耗:60.79 MB(击败 75.79% 使用 Java 的用户)
 
Tips
因为要求连续,所以可以只管往后(大)遍历,如果 x - 1 是存在的就可以直接跳过,找出最前(小)的一个开始遍历,这样可以省下很多无效的遍历次数
Source
128. 最长连续序列