用一个 HashMap 来记录每个数,极其 neighbor 的个数。当我们遍历数组当中的每一个数 num 的时候,我们 check num - 1 和 num + 1 是否也在 map 里。
如果在的化,把 left 和 right 的个数都加给当前的 num,同时更新 map。
最后如果 left 和 right 不为 0 的话,我们可以 extend 我们的边界,让一个串儿的元素的边界的个数也更新,为以后的遍历省事儿。
复杂度
Time: O(n)
public class Solution {
public int longestConsecutive(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int max = 0;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer num : nums) {
if (map.containsKey(num)) continue;
int left = (map.containsKey(num - 1) ? map.get(num - 1) : 0);
int right = (map.containsKey(num + 1) ? map.get(num + 1) : 0);
int count = left + right + 1;
max = Math.max(max, count);
map.put(num, count);
if (left > 0) {
map.put(num - left, count);
}
if (right > 0) {
map.put(num + right, count);
}
}
return max;
}
}