
大 O 的加法规则 :O(f(n))+O(g(n))=O(max(f(n),g(n)))
例如:
python
nums_sorted = sorted(nums)
for i in range(1, len(nums_sorted)):
... ...
时间总复杂度 = 排序 + 遍历 。O(nlogn) + O(n) = O(max(n log n, n)) = O(n log n )
(增长速度:n log n > n)
时间复杂度 :O(n log n )
python
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
if not nums:
return 0
nums_sorted = sorted(nums)
print(nums_sorted)
max_len = 1
cur_len = 1
for i in range(1, len(nums_sorted)):
if nums_sorted[i] == nums_sorted[i-1] + 1: # # 连续
cur_len +=1 # 如果最后一个数字在最长连续里,此时 max_len没有更新,就会退出循环了
elif nums_sorted[i] == nums_sorted[i-1] : # # 重复,题意要求,重复不算断开
cur_len = cur_len
else:
max_len = max(cur_len, max_len)
cur_len = 1
return max(max_len, cur_len)
时间复杂度 :O(n)
要真正实现 O(n) → 需要用 哈希表法:
遍历每个数字,只从"序列起点"开始向右查找连续数字,这样每个数字最多访问一次 → O(n)
子序列起点:n是最小数字
python
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
if not nums:
return 0
num_set = set(nums) # 去重,题意重复的不算
maxlen = 1
for n in num_set:
if n-1 not in num_set: # 子序列起点:n是最小数字
temp = n
cur_len =1 # 子序列长度
while temp+1 in num_set: # 走完起点为n的子序列 # O(1) 查找
temp = temp+1
cur_len += 1
# 跳出while,走完子序列
maxlen = max(maxlen, cur_len)
return maxlen