标签:else 数组排序 div int hashset 通过 分析 public 图片
一、题目
1、审题
2、分析
给出一个无序数组,求数组中存在的最长连续的数字序列的个数。
二、解答
1、思路:
方法一、
将数组排序后统计连续数值序列的个数。
public int longestConsecutive(int[] nums) { int len = nums.length; if(len < 2) return len; Arrays.sort(nums); int max = 1; int tmp = 1; for (int i = 1; i < len; i++) { if(nums[i] == nums[i-1]) continue; if(nums[i]== nums[i-1] + 1) { tmp++; max = Math.max(tmp, max); } else tmp = 1; } return max; }
方法二、
通过创建一个 Map 存储当前值的连续序列个数。
每次存入新值时,一定要更新此值的边界数值的 value。
public int longestConsecutive2(int[] nums) { int res = 0; HashMap<Integer, Integer> map = new HashMap<>(); for(int n: nums) { if(!map.containsKey(n)) { int left = (map.containsKey(n - 1)) ? map.get(n - 1) : 0; int right = (map.containsKey(n + 1)) ? map.get(n + 1) : 0; int sum = left + right + 1; map.put(n, sum); res = Math.max(res, sum); // extend the length to the boundary(s) of the sequence map.put(n - left, sum); map.put(n + right, sum); } else continue; } return res; }
方法三、
采用 Set 去重,而且可以直接在 Set 中查找向左向右延伸的连续数值的个数。
public int longestConsecutive(int[] nums) { int len = nums.length; if(len < 2) return len; Set<Integer> set = new HashSet<>(); for(Integer num: nums) set.add(num); int max = 1; for(int num: nums) { if(set.remove(num)) { int val = num; int sum = 1; while(set.remove(val-1)) val--; sum += num - val; val = num; while(set.remove(val+1)) val++; sum += val - num; max = Math.max(max, sum); } } return max; }
128. Longest Consecutive Sequence
标签:else 数组排序 div int hashset 通过 分析 public 图片
原文地址:https://www.cnblogs.com/skillking/p/9751853.html