leetcode 128

给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 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 }

猜你喜欢

转载自www.cnblogs.com/cold-windy/p/11791187.html