class Solution {
public int longestConsecutive(int[] nums) {
/**
想法1:先将数组排序后再进行处理(简单粗暴但是时间复杂度不满足题目的要求)。
想法2(答案的想法,真的是太妙了!):
即然在遍历到一个数的时候,我们都需要在数组当中去查找它的下一个数是否存在于数组当中,
而由于哈希表的查找时间复杂度为O(1)的特性,我们就可以利用这一特性,将数组当中的所有数都保存到一个哈希表中
每当遍历数组的一个数时,就去哈希表中查找它的下一个数是否存在,若存在就继续去查找下一个数的下一个数是否存在,
直到下一个数不存在为止,并记录下当前的长度,最后返回最大值。
优化:遍历到一个数时,去哈希表中查找它的上一个数是否存在,若存在,则说明这个数所处的最长序列已经被记录过了,
那么就直接跳过这个数,
*/
//1.先转换为哈希表
Set<Integer> hashTable = new HashSet<>();
for(int num : nums)
hashTable.add(num);
//2.遍历并计算出最大长度
int maxLen = 0;
for(int num : nums){
//2.1先判断当前数的前一个数是否存在,若存在,则直接跳过。
if (!hashTable.contains(num - 1)){
//2.2再判断当前数的后一个数是否存在,若存在,则继续查找并累计长度
int curLen = 0,tempNum = num;
while(hashTable.contains(tempNum)){
curLen++;
tempNum++;
}
if(curLen > maxLen)
maxLen = curLen;
}
}
return maxLen;
}
}
leetcode128. 最长连续序列
于 2024-03-05 21:31:44 首次发布