思路是在遍历数组的时候,第一次遍历先用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 };