128. 最长连续序列
-
解题思路:难点在于时间复杂度
O(n)
,如果直接排序,题目就简单了。但是不需要全部有序,只需要每次从其中拿出一个数,是递增的即可,也就是说,使用优先级队列,堆头是最小值。注:该方法仍然是O(n*logn)
-
代码
class Solution: def longestConsecutive(self, nums: List[int]) -> int: if not nums: return 0 pq = [] ans = 0 for i in range(len(nums)): heapq.heappush(pq, nums[i]) cur = 1 pre_num = heapq.heappop(pq) while pq: tmp = heapq.heappop(pq) if tmp == pre_num: continue if pre_num == tmp - 1: cur += 1 pre_num = tmp else: ans = max(ans, cur) cur = 1 pre_num = tmp ans = max(ans, cur) return ans -
方法二:把所有数加入到集合,每次从集合中取出一个数
x
,我们期望的是找到x+1
,找到x+1
后,我们期望找到x+2
,所以用一个while循环即可。-
这里面代码有优化,当我们找到一连串的
x, x+1, x+2, ... , x+k
时,再从x+1
开始时,就不用找了,因为找过一遍了 -
代码
class Solution: def longestConsecutive(self, nums: List[int]) -> int: if not nums: return 0 nums_set = set(nums) ans = 0 for num in nums_set: if num - 1 not in nums_set: # 避免重复计算 cur_num = num cur_len = 1 while cur_num + 1 in nums_set: cur_num += 1 cur_len += 1 ans = max(ans, cur_len) return ans
-
标签:
leetcode刷题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理