不定期更新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 else14 tmp = 1;15 }16 17 return max;18 }19 }
抽空将Union find方法理解下,会再对本题加一篇说明。