128. 最长连续序列
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-consecutive-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
维护连续区间
import java.util.HashMap;
import java.util.Map;
class Solution {
public int longestConsecutive(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int ret = 1;
Map<Integer, Integer> startMap = new HashMap<>();
Map<Integer, Integer> endMap = new HashMap<>();
for (int num : nums) {
if (startMap.containsKey(num) || endMap.containsKey(num)) {
continue;
}
startMap.put(num, 1);
endMap.put(num, 1);
Integer next = startMap.get(num + 1);
if (next != null) {
ret = Math.max(ret, merge(num, num + 1, startMap, endMap));
}
Integer previous = endMap.get(num - 1);
if (previous != null) {
ret = Math.max(ret, merge(num - 1, num, startMap, endMap));
}
}
return ret;
}
private int merge(int a, int b, Map<Integer, Integer> startMap, Map<Integer, Integer> endMap) {
int previous = endMap.get(a);
int next = startMap.get(b);
int length = previous + next;
startMap.put(a - previous + 1, length);
endMap.remove(a);
startMap.remove(b);
endMap.put(b + next - 1, length);
return length;
}
}
哈希表遍历
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> num_set = new HashSet<Integer>();
for (int num : nums) {
num_set.add(num);
}
int longestStreak = 0;
for (int num : num_set) {
if (!num_set.contains(num - 1)) {
int currentNum = num;
int currentStreak = 1;
while (num_set.contains(currentNum + 1)) {
currentNum += 1;
currentStreak += 1;
}
longestStreak = Math.max(longestStreak, currentStreak);
}
}
return longestStreak;
}
}
心之所向,素履以往 生如逆旅,一苇以航

浙公网安备 33010602011771号