这道题目一看就去翻答案了,因为以前见过,知道并查集可以用来做分组,但这样的题目真的要并查集么?想想也是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; } }