这道题目一看就去翻答案了,因为以前见过,知道并查集可以用来做分组,但这样的题目真的要并查集么?想想也是HashSet之类就能搞定么。果然是HashMap而不是HashSet。下面这个解法我比较容易理解,刚开始乍看发现对每一个n又要左边遍历右边遍历的,仔细一看对每一段遍历过的数字就标记一下,那么保证每个数字只访问一次,还是O(n)。
public class Solution {
public int longestConsecutive(int[] num) {
HashMap<Integer, Boolean> map = new HashMap<Integer, Boolean>();
int max = 0;
for (int n : num)
{
map.put(n, false);
}
for (int n: num)
{
if (!map.get(n))
{
int len1 = getLength(map, n-1, -1);
int len2 = getLength(map, n+1, 1);
int len = len1 + len2 + 1;
if (len > max) max = len;
}
}
return max;
}
private int getLength(HashMap<Integer, Boolean> map, int n, int step)
{
int len = 0;
while (map.containsKey(n))
{
len++;
map.put(n, true);
n += step;
}
return len;
}
}