// 直接排序使用双指针处理 // public int longestConsecutive_sort(int[] nums) { // if (nums.length <= 1) return nums.length; // Arrays.sort(nums); // int l = 0, r = 1, max = 0; // while (l < r && r < nums.length) { // if (nums[l] == nums[r]) { // r++; // l++; // } // } // return max; // }
// 我最开始想到的解法是:set去重,最大堆逐个取出并且监控连续性,但是这样不符合实际复杂度O(n) publicintlongestConsecutive_brute(int[] nums) { if (nums.length <= 1) return nums.length; Set<Integer> set = newHashSet<>(); List<Integer> list = newArrayList<>(); for (int num : nums) { if (set.add(num)) { list.add(num); } } Collections.sort(list);
// 双指针 intl=0, r = 1, max = 0; while (l < r && r < list.size()) { if (list.get(r) - list.get(l) == r - l) { max = Math.max(max, r - l + 1); r++; } else { l = r; r++; } } return max; }
// 看完官方解法的知道的解法 publicintlongestConsecutive(int[] nums) { Set<Integer> set = newHashSet<>(); for (int num : nums) { set.add(num); } intmax=0; for (Integer num : set) { intcounter=1; if (!set.contains(num - 1)) { intindex= num; while (set.contains(index + 1)) { index++; counter++; } } max = Math.max(max, counter); } return max; }