思路是在遍历数组的时候,第一次遍历先用hashset存住所有的元素。再遍历第二次,第二次遍历的时候,找每一个元素的left (num - 1)和right (num + 1),若找到,就在hashset中移除,同时移动left和right的位置。最终最长的子序列长度为right - left - 1

 1 /**
 2  * @param {number[]} nums
 3  * @return {number}
 4  */
 5 var longestConsecutive = function(nums) {
 6     let res = 0;
 7     let set = new Set();
 8     for (let i = 0; i < nums.length; i++) {
 9         let num = nums[i];
10         set.add(num);
11     }
12     for (let i = 0; i < nums.length; i++) {
13         let cur = nums[i];
14         let down = cur - 1;
15         while (set.has(down)) {
16             set.delete(down);
17             down--;
18         }
19         let up = cur + 1;
20         while (set.has(up)) {
21             set.delete(up);
22             up++;
23         }
24         res = Math.max(res, up - down - 1);
25     }
26     return res;
27 };
01-25 10:50
查看更多