参考资料:左程云算法课
128. Longest Consecutive Sequence
Given an unsorted array of integers nums, return the length of the longest consecutive elements sequence.
You must write an algorithm that runs in O(n) time.
Example 1:
Input: nums = [100,4,200,1,3,2]
Output: 4
Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4.
思路:
建立一个map,其key是num值(来自于给定数组),value是其所在连续区间的长度(如<100,1>,则说明目前只有100自己构成连续区间)。
遍历数组,忽略掉那些曾经进过map的数;只有新数i
才被放进map中,其值先设为1(他自己作为区间,长度本身就是1;另外,也可起到去重的作用,后来的点如果=i,自动被忽略);然后检查map.containsKey(i-1)
看新数能不能接上自己左边的连续区间(如果有的话),再检查map.containsKey(i+1)
看新数能不能接上自己右边的连续区间(如果有的话)。然后,对于 由于新数的到来而被延长的连续区间,我们只更新该区间的头尾点在map中的记录,因为后来的点如果落在这个区间内,对“延长区间”这件事毫无帮助。
public int longestConsecutive(int[] nums)
{
HashMap<Integer,Integer> map = new HashMap<>();// <position,lenInterval>
int len=0;
for(int i:nums)
{
if(!map.containsKey(i))
{
map.put(i,1);
int left=map.containsKey(i-1)?map.get(i-1):0;
int right=map.containsKey(i+1)?map.get(i+1):0;
map.put(i-1-left+1,left+right+1);
map.put(i+1+right-1,left+right+1);
len = Math.max(len,left+right+1);
}
}
return len;
}