题目描述
我的思路
我的思路比较暴力,就是首先将数组从小到大进行排序,然后再依次遍历判断序列是否连续并时时更新连续序列的最长长度。比如示例1:nums = [100, 4, 200, 1, 3, 2],第一步先将数组进行排序得到sort_nums = [1, 2, 3, 4, 100, 200];第二步遍历的时候其实不用每个数都遍历,比如遍历1的时候发现1和后面的2,3,4是连续的,那么后续2,3,4就不用再遍历了,直接从100开始遍历;每遍历一个元素时记录以该元素开头的连续序列长度,实时更新前面所有连续序列的最长长度;最后输出最长长度。
这个思路是可以解决问题的,但是时间复杂度明显不符合题目要求,首先看排序的时间复杂度就超过O(n)了,后续遍历的时间复杂度为O(n^2),算法仍需进一步优化。
官方题解:哈希表
看了官方题解的哈希表解法,再对照我自己的暴力搜索思路,发现了2个关键的改进点。
1、利用哈希表搜索高效的优势,替代数组元素遍历(因为本质上是判断特定元素是否存在的问题)。
2、利用连续序列的性质来减少重复搜索的次数,比如发现从1开始的1,2,3,4的连续序列后,再看从2开始的连续序列时就可以直接跳过了,因为2的前一数1存在,因此以1开头的连续序列肯定比2开头的连续序列长。
经过这两点的优化,算法的复杂度就是搜索哈希表的复杂度,即O(n)。
该思路的代码如下:
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
longest_streak = 0
num_set = set(nums) # 转成集合,只留唯一元素即可
for num in num_set:
if num - 1 not in num_set: # 如果前一个元素并不存在,则作为序列的起始元素进行连续序列长度的计数
current_num = num
current_streak = 1
while current_num + 1 in num_set: # 若下一个数字存在则连续序列长度进行更新
current_num += 1
current_streak += 1
longest_streak = max(longest_streak, current_streak)
return longest_streak
参考
力扣官方题解: 最长连续序列