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;
};

  

posted on 2019-04-02 20:57  promise。  阅读(81)  评论(0编辑  收藏  举报