题目:最长连续序列
来源:Leetcode
根据题目要求可知,要求得最长连续序列为连续得自然数,例如:
[1,2,3,4] # 连续
[1,2,4] # 非连续
首先,我们思考暴力解法。
对于数组中的每个数num[i],我们用内层循环重新遍历数组,寻找有没有target == nums[i] + 1,如果为True,继续+1遍历,若为False,退出内层循环,输出当前连续序列长度。
对于暴力解法,我们可以对其进行优化,我们使用Hash表来保存nums中元素,这样我们在判断是否存在target == nums[i] + 1时,可以在O(1) 的时间复杂度内实现,这是典型的空间换时间思想。
但是,仅仅如此,我们的算法还是维持在了O(n^2) 的复杂度,那么,我们如何在内层循环中优化呢?
其实,我们在寻找 nums[i] 的元素的最长连续序列时,当内层while循环退出时,说明此时 target == nums[i] + 1 条件已无法满足,那么,我们在对nums[i+1] 进行判断时,我们仅仅需要看 nums[i] - 1 是否存在在Hash表中即可,因为如果 nums[i] - 1 存在于Hash表中,我们在对 nums[i] 进行判断时,已经将其包括进去了。这样,我们大大降低了内层循环判断的次数。此时,我们的时间复杂度便可以满足题目要求。代码如下:
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
nums_set = set(nums)
res = 0
for num in nums_set:
curr = 1
curr_sum = num
if num-1 not in nums_set:
while curr_sum+1 in nums_set:
curr_sum += 1
curr += 1
res = max(res, curr)
return res