LeetCode热题100精讲——Top3:最长连续序列【哈希】
|
文章目录
- 题目背景
- 最长连续序列
- C++解法
- Python解法

题目背景
如果大家对于 哈希 类型的概念并不熟悉, 可以先看我之前为此专门写的算法详解:
蓝桥杯算法竞赛系列第九章·巧解哈希题,用这3种数据类型足矣
最长连续序列
题目链接:最长连续序列
解题思路:
这道题最直接的想法就是排序,排序之后连续的序列就很容易找到了。但是排序的时间复杂度是
O(NlogN)
,而题目要求我们时间复杂度为O(N)
,所以我们需要另想办法。想找连续序列,首先要找到这个连续序列的开头元素,然后递增,看看之后有多少个元素还在
nums
中,即可得到最长连续序列的长度了。由此我们可以想到用空间换时间的思路,把数组元素放到哈希集合里面,然后去寻找连续序列的第一个元素,即可在
O(N)
时间找到答案。比方说
nums = [8,4,9,1,3,2]
,我们先找到 1,然后递增,找到了 2, 3, 4,这就是一个长度为 4 的序列。
代码详情:
C++解法
class Solution {
public:
int longestConsecutive(vector<int>& nums)
{
// 本题重点在于找到连续序列的第一个值
// 转化成哈希集合,方便快速判断是否存在某个元素
unordered_set<int> set;
for (int num : nums)
{
set.insert(num);
}
// 记录结果
int res = 0;
for (int num : set) {
if (set.count(num - 1)) {
// num 不是连续子序列的第一个,跳过
continue;
}
// num 是连续子序列的第一个,开始继续计算连续子序列的长度
int curNum = num;
int curLen = 1;
while (set.count(curNum + 1)) {
curNum += 1;
curLen += 1;
}
// 更新最长连续序列的长度
res = max(res, curLen);
}
return res;
}
};
Python解法
集合的优势就是能够快速判断是否存在某个元素.
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
# 本题重点在于找到连续序列的第一个值
set_nums = set(nums) # 将数组存放到哈希集合中
res = 0 # 记录结果
for num in set_nums:
# 判断当前值是不是连续序列的第一个值
if num - 1 in set_nums:
continue
curNum = num
curLen = 1
while curNum + 1 in set_nums:
curNum += 1
curLen += 1
res = max(res, curLen)
return res
|
|