Description:
Given an unsorted array, and we need to find out the longest consecutive sequence. And the the complexity should be O(n).
Solution:
It is easy to solve this problem after sorting this array, and just scan the array, but time complexity will be O(nlogn).
To reach the O(n), we can make the most of hashcode.
1. Two hash sets, one to remember all the integers, one to record all the integers that has visited.
2. It is somewhat like a bfs. We first iterator the first hash set, and check whether it is in the second hash set, if so, then continue the loop because it has been previously visited.
3. So now we get a previously-not-visited integer, the we use a loop to find all the available integer in the array and put them in the second hash set, so that the visited set is preserved. And remember to keep the longest number.
import java.util.HashSet;
import java.util.Iterator;
public class Solution {
public int longestConsecutive(int[] num) {
int l = num.length;
HashSet<Integer> set = new HashSet<Integer>();
HashSet<Integer> visit = new HashSet<Integer>();
for (int i = 0; i < l; i++) {
set.add(num[i]);
}
Iterator<Integer> ite = set.iterator();
int longest = 1, x, temp, tot;
while (ite.hasNext()) {
x = ite.next();
if (visit.contains(x))
continue;
visit.add(x);
tot = 1;
temp = x - 1;
while (set.contains(temp)) {
tot++;
visit.add(temp);
temp--;
}
temp = x + 1;
while (set.contains(temp)) {
tot++;
visit.add(temp);
temp++;
}
longest=Math.max(longest, tot);
}
return longest;
}
public static void main(String[] args) {
int arr[] = { 100, 4, 200, 1, 3, 2 };
Solution s = new Solution();
System.out.println(s.longestConsecutive(arr));
}
}