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