128.Longest Consecutive Sequence

题目链接

题目大意:给出一个数组,找出其中连续数值最多的长度。例子如下:

法一:o(nlgn)。先排序,然后遍历一遍,查找连续数值,一旦不连续,则更新ma。代码如下(耗时1ms):

 1     public int longestConsecutive(int[] nums) {
 2         if(nums.length == 0) {
 3             return 0;
 4         }
 5         //排序
 6         Arrays.sort(nums);
 7         int cnt = 1, ma = 1;
 8         //逐一遍历
 9         for(int i = 1; i < nums.length; i++) {
10             //去除重复值
11             if(nums[i] == nums[i - 1]) {
12                 continue;
13             }
14             //如果连续
15             else if(nums[i] == nums[i - 1] + 1) {
16                 cnt++;
17             }
18             //一旦不连续,更新ma和cnt
19             else {
20                 if(cnt > ma) {
21                     ma = cnt;
22                 }
23                 cnt = 1;
24             }
25         }
26         //由于可能整个数组一直连续,所以最后还应该再判断一下
27         if(cnt > ma) {
28             ma = cnt;
29         }
30         return ma;
31     }
View Code

 法二:o(n)。利用hashmap,键值对是<nums[i],总连续个数>。具体代码如下(耗时18ms):

 1     public int longestConsecutive(int[] nums) {
 2         HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
 3         int res = 0;
 4         for(int i = 0; i < nums.length; i++) {
 5             //如果已经存在,则继续遍历
 6             if(map.containsKey(nums[i])) {
 7                 continue;
 8             }
 9             //找到当前值左连续的数值个数
10             int left = map.containsKey(nums[i] - 1) ? map.get(nums[i] - 1) : 0;
11             //找到当前值右连续的数值个数
12             int right = map.containsKey(nums[i] + 1) ? map.get(nums[i] + 1) : 0;
13             //计算当前值总连续的数值个数
14             int sum = left + right + 1;
15             //更新到map中
16             map.put(nums[i], sum);
17             //找最大值
18             res = Math.max(res, sum);
19             //这个是重点!!!更新左连续和右连续的数值个数,但是为啥不就近更新呢?比如说nums[i]-1,而要更新那么远的?
20             map.put(nums[i] - left, sum);
21             map.put(nums[i] + right, sum);
22         }
23         return res;
24     }
View Code

 

posted on 2018-04-12 11:39  二十年后20  阅读(125)  评论(0编辑  收藏  举报

导航