LeetCode 128. 最长连续序列
题目描述
思路分析
这个问题的关键在于如何在 O(n) 时间内找到最长连续序列。我们可以使用 HashSet 来实现这一目标,具体思路如下:
- 创建一个 HashSet,将数组中的所有元素存储到 HashSet 中。
- 遍历数组中的每个元素,对于每个元素 num,判断 num - 1 是否存在于 HashSet 中。如果不存在,说明 num 是一个连续序列的起点。
- 对于每个连续序列的起点 num,开始递增 num,同时检查 num + 1 是否存在于 HashSet 中,以此来扩展连续序列的长度。
- 在遍历过程中,不断更新最长连续序列的长度。
- 返回最长连续序列的长度作为结果。
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func longestConsecutive(nums []int) int {
numSet := make(map[int]bool)
for _, num := range nums {
numSet[num] = true
}
maxLength := 0
for num := range numSet {
if !numSet[num-1] { // 如果 num 是序列的起点
curNum := num
curLength := 1
// 依次检查序列中的下一个数字
for numSet[curNum+1] {
curNum++
curLength++
}
// 更新最大长度
if curLength > maxLength {
maxLength = curLength
}
}
}
return maxLength
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public int longestConsecutive(int[] nums) {
int res = 0;
Set<Integer> hashSet = new HashSet<>();
for (int num : nums) {
hashSet.add(num);
}
for (int num : nums) {
if (!hashSet.contains(num - 1)) {
int cur = num;
int len = 1;
while (hashSet.contains(cur + 1)) {
cur++;
len++;
}
res = Math.max(res, len);
}
}
return res;
}
}
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
本博客所有文章除特别声明外,均采用