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;
}
}