关于LeetCode最长连续序列解法时间复杂度的疑问
关于最长连续序列解法的时间复杂度分析
你的这个解法的时间复杂度是O(n),绝对不是O(n²),核心原因是每个元素只会被处理两次:一次是遍历数组时的检查,一次是在统计连续序列时的访问,不会有重复的冗余操作。
咱们拿你说的输入nums = [5,4,3,2,1]具体拆解:
- 第一步把数组转成集合,这一步是O(n)的时间开销。
- 然后遍历数组中的每个元素:
- 遍历到5时,检查
5-1=4在集合里,直接跳过,不做后续统计。 - 遍历到4时,检查
4-1=3在集合里,跳过。 - 遍历到3时,检查
3-1=2在集合里,跳过。 - 遍历到2时,检查
2-1=1在集合里,跳过。 - 遍历到1时,检查
1-1=0不在集合里,这时候才会触发连续序列的统计:依次找1+1=2、2+1=3、3+1=4、4+1=5,直到5+1=6不在集合里为止。这一步会访问1、2、3、4、5这五个元素。
- 遍历到5时,检查
你算一下总操作次数:遍历5个元素(5次)+ 统计时访问5个元素(5次),总共10次,和数组长度n成正比,是线性时间。
本质上,这个解法的关键逻辑是只从连续序列的起点开始统计,那些属于序列中间的元素会直接被跳过,不会进入内层的循环。每个元素要么作为起点被处理一次,要么作为序列的一部分被统计一次,不会被重复处理。所以不管输入是有序还是无序的,整体的时间复杂度都是严格的O(n),完全符合题目要求的时间限制。
内容的提问来源于stack exchange,提问作者user24982840
相关产品推荐
相关产品推荐

