目录

每日一题一一Leetcode128.-最长连续序列-力扣

每日一题一一Leetcode128. 最长连续序列 - 力扣

每日一题一一Leetcode128. 最长连续序列 - 力扣

作者:blue

时间:2025.3.14

本题的要求是:给定一个未排序的整数数组 nums ,找出其中数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

本题用排序加遍历的方法非常容易解决,但是算法的效率太低。

本题正真的解题思路如下,

首先,数组中是有可能出现重复的数字,但是重复的数字其实并不影响我们找数字连续的最长序列,因为再多相同的也只能算一个长度,所以,我们可以先对数组进行一个 去重 (放进集合中)。

然后我们遍历这个去重后的集合,每次遍历到一个数(在这里我称之为num),我们就去询问set,“num-1在不在集合中?”

问这个的目的是判断当前这个num有没有资格作为数字连续序列的开头,你想,如果num-1都存在,那么你以num为头去找一个数字连续序列,那肯定不会是最长的。

好,那么如果num-1不存在,那么说明num有资格,作为数字连续序列的开头,我们就不断询问num+1,num+2,num+3,……在不在集合中,看看什么时候停下来,然后,维护最长序列的长度即可。

C++代码:

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        int ans=0;
        unordered_set<int> us(nums.begin(),nums.end());
        for(int num:us){
            if(!us.contains(num-1)){
                int cur_num = num;
                int cur_len = 1;
                while(us.contains(cur_num+1)){
                    cur_num+=1;
                    cur_len+=1;
                }
                ans = max(cur_len,ans);
            }
        }
        return ans;
    }
};

Java代码

import java.util.HashSet;

public class Day03_demo128 {
    public static void main(String[] args) {
        int x = longestConsecutive(new int[] {0,3,7,2,5,8,4,6,0,1});
        System.out.println(x);
    }
    public static int longestConsecutive(int[] nums) {
        int res = 0;
        HashSet<Integer> hashSet = new HashSet<>();
        for (int num : nums) {
            hashSet.add(num);
        }
        for (Integer num : hashSet) {
            if(!hashSet.contains(num-1)){
                int curNum = num;
                int curLen = 1;
                while(hashSet.contains(curNum+1)){
                    curNum+=1;
                    curLen+=1;
                }
                res = Math.max(curLen,res);
            }
        }
        return res;
    }
}