目录
题目:
题目描述:
题目链接:
思路:
核心思路:
哈希表
思路详解:
题目要求时间复杂度O(n),排序的时间复杂度是O(nlogn),所以这题不能使用排序来解决
我们可以利用哈希集合,把数组中的所有元素存入哈希集合,哈希集合有自动去重的特性。然后遍历集合中的元素,设在哈希集合中遍历到的元素为x,以x为起点,不断查找下一个数x+1,x+2,...是否在哈希集合中。一旦找不到下一个连续的数,就退出返回序列的长度。为统计最长连续序列长度,我们可以定义ans,每次得到一个序列长度就用max取较大值。
其中还有一个非常巧妙的优化,就是在不断查找下一个数之前,我们可以先判断x-1是否在哈希集合中,这一步可以避免很多重复计算。我们可以这样理解,如果现在以3为起点有一段连续序列是3 4 5,但是此时ans记录的是之前以2为起点的连续序列2 3 4 5,那么以3为起点的这一次查找就是完全没有必要的。因为如果哈希集合中存在x-1,那么以x为起点的连续序列,以x-1为起点一定更长。
代码:
Java代码详解:
class Solution {
public int longestConsecutive(int[] nums) {
int ans=0;
Set<Integer> s=new HashSet<>();
for(int i=0;i<nums.length;i++) //把nums的每一个元素存入哈希集合,自动去重
{
s.add(nums[i]);
}
for(int x : s) //遍历哈希集合
{
if(s.contains(x-1)) //非常巧妙的优化
{
continue;
}
//x是序列的起点
int y=x+1; //定义y为x的下一个数
while(s.contains(y)) //不断查找下一个数是否在哈希集合中
{
y++;
}
//一旦退出上述循环,此时记录的y是不在哈希集合的第一个数
//所以y-1是最后一个在哈希集合中的数
ans=Math.max(ans,y-x); //从x到y-1一共y-x个数
//每次取max得到最长连续序列的长度
}
return ans;
}
}