题目:
难度级别: ★★★
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.
题目分析:题目给出一个整数数组。要求出数组中,最长连续的序列有多长。题目要求线性时间复杂度。
思路:
- 建立一个HashMap,把所有数组num中的数放到HashMap中
- 从前往后遍历数组num中的每一个数
- 对于num[i],令count = 1
- 先从num[i]开始往前一个个的检查,前面一个数是否在HashMap中,是的话count++,继续检查下一个前面的数
- 再从num[i]开始往后一个个的检查,后面一个数是否在HashMap中,是的话count++,继续检查下一个后面的数
- 检查完,num[i],如果其count大于数组num大小的一半,count肯定是最大的,直接返回
- 否则,检查count是否大于max,是的话令max = count
代码:
import java.util.HashMap;
public class Solution {
public int longestConsecutive(int[] num) {
if (num == null){
return 0;
}
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
//put the numbers in num[] into the map
for (int i = 0; i < num.length; i++){
map.put(num[i],i);
}
int max = 0;
for (int i = 0; i < num.length; i++){
int count = 1;
//look the consecutive number of num[i] backward
int temp = num[i];
while (map.containsKey(--temp)){
count++;
}
//look the consecutive number of num[i] forward
temp = num[i];
while (map.containsKey(++temp)){
count++;
}
//if count is larger than the half of num[]'s size, directly return count
if (count >= num.length/2 + 1){
return count;
}
//else check whether count is larger than max
if (count > max){
max = count;
}
}
return max;
}
}