给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
//感想:感觉动态规划好像做不了,看着像是要用到hash的数据结构,又觉得要用桶排序,正好跟hash还有点关系的感觉,就用桶排序,但是不可以,因为这个数据太大了,会出现Integer.MIN_VALUE,Integer.MAX_VALUE;有的测试用例通过不了,就看了下答案,发现答案是用hash做的。
//思路:对于这种又时间复杂度要求的题目,但是排序又不行的,一般用hash,hash存储起来是On的复杂度,再查找的话就是O1了,但是这里面一般肯定还是有东西的,不然复杂度肯定还是大于On的,因为你需要遍历存储的hash结构是On,但是查找肯定还要遍历所以肯定要优化,不然复杂度肯定超了。
这里的优化主要在:比如说有1,2,3,4 这四个连续的数字查找,你查找了1,往后走到2,3,4,所以当你查找4的时候就往后走一步,发现存在就不要查4了,因为之前有的所以肯定会带上这个4,所以就不要查了,这一步的优化做了就可以了。
1 class Solution { 2 public int longestConsecutive(int[] nums) { 3 if(nums==null||nums.length==0) 4 return 0; 5 HashSet<Integer> set=new HashSet<>(); 6 for(int i=0;i<nums.length;i++) 7 set.add(nums[i]); 8 int longestlen=0; 9 for(int num:set) 10 { 11 if(set.contains(num-1)) 12 continue; 13 int current=1; 14 while(set.contains(num+1)) 15 { 16 current++; 17 num++; 18 } 19 longestlen=Math.max(current,longestlen); 20 } 21 return longestlen; 22 } 23 }