大家好!我是曾续缘💝
今天是《LeetCode 热题 100》系列
发车第 3 天
哈希第 3 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
最长连续序列 给定一个未排序的整数数组
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提示:
难度:💖💖
0 <= nums.length <= 105
-109 <= nums[i] <= 109
思路
如果将数组排序,那就是一个从头到尾数数的问题,但是这样做的话,排序需要 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))的时间复杂度。
我们可以将数数的问题改为判断的形式进行。为什么需要排序,因为我们想在遍历时从一个连续序列的开头数到结尾来计算序列的长度。如果我们知道了一个序列的开头,为了判断连续,只需要判断下一个数是否在数组中存在就可以了,如此往复,直到下一个数不在数组中,就到了序列的结尾,也就可以直到序列长度了。
第二个问题是为了找到序列的开头,如何知道哪个数是序列的第一个数?也很简单,如果前一个数不在数组中,那这个数就是序列的开头第一个数了。
解题方法
将所有的数字加到哈希表中, 可以去掉多余的重复数字, 然后遍历哈希表中的每个数字, 如果是连续序列的第一个数字, 就不断地判断这个数字+1
的数是否存在哈希表中, 这样找到这个连续序列的最后一个数字,进而得到这个序列的长度, 对于不是连续序列的第一个数字, 肯定就不是最长的连续序列, 跳过即可.
Code
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> se = new HashSet<>();
for(int num : nums){
se.add(num);
}
int ans = 0;
for(int num : se){
if(se.contains(num - 1)){
continue; // 说明不是连续序列中的第一个数字, 跳过
}
int cur = num;
while(se.contains(cur + 1)){
cur++;
}
ans = Math.max(ans, cur - num + 1);
}
return ans;
}
}