Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
Your algorithm should run in O(n) complexity.
Example:
Input: [100, 4, 200, 1, 3, 2]
Output: 4
Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]
. Therefore its length is 4.
以下将用三种方法来解决这道题
1.常规方法
先升序排序,再挨个检查。
如果这个数比前一个数大一,则该数的长度=前一个数的长度加一。
如果这个数跟前一个数相等,则,长度=前一个数的长度。
如果这个数以上两种情况都不是,则长度为一。
2.哈希表
将数组映射成一个哈希表,一个数一个数的查看。
先检查该数的left值=num[i]-1在哈希表中存在否,如果存在,则继续-1,该数代表的长度+1,直到检查到该数不存在为止。
再检查该数的right值。。同理。
3.哈希表+并查集
也是将数组映射成哈希表,检查的时候用并查集找到边界为止。
该数的头节点就更新为左边界加右边界的长度。
/** * @param {number[]} nums * @return {number} */ var longestConsecutive = function(nums) { var len = nums.length; if(len == 0 || len == 1) return len; var p = {}; var dp = {}; var hash = {}; var ans = 0; for(var i = 0; i < len; i++) { p[nums[i]] = nums[i]; hash[nums[i]] = true; dp[nums[i]] = 1; } function find(x) { if(x === p[x]) return x; return p[x] = find(p[x]); } for(var i = 0; i < len; i++) { var x, y, z; x = find(nums[i]); if(hash[nums[i]-1] === true) y = find(nums[i]-1); if(hash[nums[i]+1] === true) z = find(nums[i]+1); if(hash[nums[i]-1] === true && x !== y) { dp[x] += dp[y]; p[y] = x; } if(hash[nums[i]+1] === true && x !== z) { dp[x] += dp[z]; p[z] = x; } ans = Math.max(ans, dp[x]); } return ans; };