原题链接: https://oj.leetcode.com/problems/longest-consecutive-sequence/
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
For example,
Given [100, 4, 200, 1, 3, 2]
,
The longest consecutive elements sequence is [1, 2, 3, 4]
. Return its length: 4
.
Your algorithm should run in O(n) complexity.
思路:首先想到的是排序,显然排序O(nlogn),然后数组扫描O(n)。复杂度不符合题目要求。
O(n)的算法如果没有巧妙的解法基本都是空间换时间,用HashSet存入每个数字,每个数字只会出现在一个字串中,因此拿出Set中一个数字,每次加 1看是否在HashSet中,是则计数加1。同理减1也一样,每次判断完后都从Set中删除该数字。总共也是需要O(n)的时间。
public class Solution {
public int longestConsecutive(int[] num) {
if (num == null || num.length < 1) {
return 0;
}
HashSet<Integer> numSet = new HashSet<Integer>();
for (int a : num) {
numSet.add(a);
}
int maxCnt = 0;
while (!numSet.isEmpty()) {
Iterator<Integer> it = numSet.iterator();
Integer curNum = it.next();
it.remove();
int count = 1;
int bigger = curNum;
while (numSet.contains(++bigger)) {
count++;
numSet.remove(bigger);
}
int litter = curNum;
while (numSet.contains(--litter)) {
count++;
numSet.remove(litter);
}
if (count > maxCnt) {
maxCnt = count;
}
}
return maxCnt;
}
}