高效的方法是用一个哈希表存储数组中的数,这样查看一个数是否存在即能优化至 O(1) 的时间复杂度。
从x−1开始尝试匹配,如果x-1不在数组才会进入内层循环,然后在内层循环中匹配连续序列中的数,计算长度,因此数组中的每个数只会进入内层循环一次。
使用set,set也是hashtable的一种
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
longest_length = 0
num_set = set(nums)
for num in num_set:
if num-1 not in num_set:
current_num = num
current_length = 1
while current_num + 1 in num_set:
current_num += 1
current_length += 1
longest_length = max(longest_length,current_length)
return longest_length
时间复杂度:O(n),其中 n 为数组的长度。具体分析已在上面正文中给出。
空间复杂度:O(n)。哈希表存储数组中所有的数需要 O(n)的空间。
使用hashtable
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
hashtable = dict()
max_length = 0
for num in nums:
if num not in hashtable:
left = hashtable.get(num-1,0)
right = hashtable.get(num+1,0)
cur_length = 1 + left + right
if cur_length > max_length:
max_length = cur_length
hashtable[num] = cur_length
hashtable[num-left] = cur_length
hashtable[num+right] = cur_length
return max_length #return 要对应for循环,要不然就只进去一次