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 }
法二: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 }