[Leetcode] 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),空间复杂度取决于具体的sort算法
二、使用hashset可以将时间复杂度降低为O(N),同时空间复杂度是O(N)
基本思想是:对于每一个数字num,在hashset当中查找含有num的那个区间的左边界和右边界,从而得到这个独立区间,从而获得它的长度。
corner case:在检查一个数字之后应该将其从hashset当中删除,因为那个数字所在的区间已经被搜索了,没有必要再重复的搜索,不然复杂度会变得非常高
例如: 3 2 1 4 5 6 7 10 9 8
如果不在检查过程当中进行删除,那么美都会遍历[1,10]这个区间,实际上在 3的时候,就已经把这个区间遍历了一遍,以后再遇到这个区间当中的数字,应该直接跳过。
具体的代码如下:
1 import java.util.*; 2 3 public class Solution { 4 public int longestConsecutive(int[] nums) { 5 Set<Integer> set = new HashSet<Integer>(); 6 for(int i: nums) 7 set.add(i); 8 int max = Integer.MIN_VALUE; 9 for(int i=0;i<nums.length;i++){ 10 if(!set.contains(nums[i])) continue; 11 int count = 1; 12 int mid = nums[i]; 13 set.remove(mid); 14 //to left 15 int left=mid-1; 16 while(true){ 17 if(set.contains(left)){ 18 set.remove(left); 19 count++; 20 left--; 21 }else{ 22 break; 23 } 24 } 25 //to right 26 int right = mid+1; 27 while(true){ 28 if(set.contains(right)){ 29 set.remove(right); 30 count++; 31 right++; 32 }else{ 33 break; 34 } 35 } 36 max = Math.max(max,count); 37 } 38 return max; 39 } 40 }
一、在此总结一下Set的用法,Set在java当中是一个接口,具体可以实现为HashSet, TreeSet, LinkedTreeSet
Set set = ....
set.add()
set.contains()
set.remove()
二、Map的用法 参考
在此总结一下Map的用法,Map在java当中是一个接口,具体可以实现为HashMap, TreeMap, LinkedTreeMap
Map map = ....
map.put(key,value);
set.containsKey()
set.remove()