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;
};
浙公网安备 33010602011771号