/**
* @param {number[]} nums
* @return {number}
*/
var longestConsecutive = function(nums) {
let idx= new Set(nums);
let len=0;
for(let x of idx){
if(idx.has(x-1)) continue;
//确保x一定是这个序列的第一个
let y=x+1;
while(idx.has(y)) y++;
len=Math.max(len,y-x);
//优化
if(2*len>idx.size) break;
}
return len;
}
核心思想:哈希集合
if(idx.has(x-1)) continue;
//核心核心核心
算法细节:for循环遍历的一定要是新的哈希集合,不能是原数组nums,否则会重复查找非常多次
API 调用: Set


语法细节: size和length
| 数据类型 | 属性 | 说明 |
|---|---|---|
| Array | length | 元素数量 |
| Set | size | 元素数量 |
| Map | size | 键值对数量 |
| String | length | 字符数量 |
时间复杂度分析: O(N)
虽然这是一个"循环嵌套",但其实这是线性查找,因为每个元素只被访问一次,"核心"的那一步时间复杂度是O(1),这最关键的,确保不会重复查找
1619

被折叠的 条评论
为什么被折叠?



