leetcode 128. 最长连续序列

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-consecutive-sequence

给定一个未排序的整数数组 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

分析

排序+一次遍历

题干没有要求不能排序,那就先排序;没有说不能调用库函数,就调用Arrays.sort()
排序以后很好理解,但需要注意二点:

  • 当遍历到最后一位(下标n-1)时,注意对ans进行总结。否则最后一位遍历结束直接跳到for循环后的代码,没有对ans进行总结
  • 出现连续相同的数字很好处理,在循环中用continue。但是,如果连续相同一直持续到最后一位(下标n-1),需要对ans进行总结,理由同上
class Solution {
    public int longestConsecutive(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length;
        if(n == 0){
            return 0;
        }
        int ans = 1;
        for1:
        for(int i=1;i<n;i++){
            if(nums[i-1] + 1 == nums[i]){
                int temp = 1;
                for2:
                for(int j=i;j<n;j++){
                    if(nums[j-1] + 1 == nums[j]){
                        temp++;
                        if(j == n-1){
                            ans = Math.max(ans, temp);
                            i = j;
                            break for2;
                        }
                    }
                    else if(nums[j-1] == nums[j]){
                        if(j == n-1){
                            ans = Math.max(ans, temp);
                            i = j;
                            break for2;
                        }
                        continue for2;
                    }
                    else{
                        ans = Math.max(ans, temp);
                        i = j;
                        break for2;
                    }
                }
            }
        }
        return ans;
    }
}

哈希表

使用库排序函数的方法显得有些取巧。官方给出的更稳妥的方法是哈希表,虽然时间复杂度变高了。
当读到一个数n,查找表中是否有n-1.如果没有,n只可能是一个连续序列开头的数(该序列长度最短为1),此时将计数器重置;继续搜索,如果发现n+1存在,更新计数器。最终返回最大计数值。

class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> num_set = new HashSet<Integer>();
        for(int num:nums){
            num_set.add(num);
        }

        int longestNum = 0; // 不能忽略 nums.length == 0 的情况
        for(int num:nums){
            if(!num_set.contains(num-1)){
                int count = 1;
                int currentNum = num;

                while(num_set.contains(currentNum + 1)){
                    count++;
                    currentNum++;
                }

                longestNum = Math.max(longestNum, count);
            }
        }
        return longestNum;
    }
}
posted @ 2021-12-05 20:04  PaB式乌龙茶  阅读(49)  评论(0编辑  收藏  举报