码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 128. Longest Consecutive Sequence

时间:2016-06-07 16:19:30      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

不定期更新leetcode解题java答案。

采用pick one的方式选择题目。

题目的意思是给定一个无序数组,寻找最长有序连续数组的长度。

最初是思路是假定输入数组的数字范围在-10000~10000间,创建一个空间为2w的数组,赋值为0,遍历给定数组,将数组值视为创建数组下标,将创建数组对应值+1;最后遍历创建数组获得最大长度。

代码如下:

 1 public class Solution {
 2     public int longestConsecutive(int[] nums) {
 3         int[] count = new int[20000];
 4         for(int i = 0; i < 20000; i++)
 5             count[i] = 0;
 6         for(int i = 0; i < nums.length; i++)
 7             count[nums[i] + 10000]++;
 8         
 9         int max = 0;
10         int tmp = 0;
11         for(int i = 0; i < 20000; i++){
12             if(count[i] != 0)
13                 tmp++;
14             else{
15                 max = tmp > max ? tmp : max;
16                 tmp = 0;
17             }
18         }
19         
20         return max;
21     }
22 }

理论来讲,思路是可行的,然而个人加入了限制条件,那就是输入在-10000~10000,一个测试用例将本思路打屎。技术分享

 

提示中希望使用union find方法来进行题目的解答。数据结构没好好学,看了半天没看懂,先偷懒拿个简单方法处理下。思路是将数组排序,然后统计最长连续子序列。逻辑很简单,虽然题目中加入了限制,时间复杂度在O(n),但是具体测试时没有对此进行限制,并且结果也出乎意料的快。代码如下:

 1 public class Solution {
 2     public int longestConsecutive(int[] nums) {
 3         Arrays.sort(nums);
 4         int max = 1;
 5         int tmp = 1;
 6         for(int i = 1; i <= nums.length; i++){
 7             max = tmp > max ? tmp : max;
 8             if(i == nums.length)
 9                 break;
10             if(nums[i] == nums[i - 1]){}
11             else if(nums[i] - nums[i - 1] == 1)
12                 tmp++;
13             else
14                 tmp = 1;
15         }
16         
17         return max;
18     }
19 }

抽空将Union find方法理解下,会再对本题加一篇说明。

Leetcode 128. Longest Consecutive Sequence

标签:

原文地址:http://www.cnblogs.com/zslhq/p/5567285.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!