Leetcode 128. Longest Consecutive Sequence

不定期更新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方法理解下,会再对本题加一篇说明。

posted @ 2016-06-07 15:57  zslhq~  阅读(569)  评论(0编辑  收藏  举报