题目描述
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
解题思路
暴力解法
1、以最快的效率先排序。
2再遍历一趟序列得到结果,时间复杂度主要取决于排序的快慢,好的情况下是O(n),坏的情况下是O(n^2)。
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
l = len(nums)
if l < 2:
return l
nums.sort()
print(nums)
result = 0
tmp = 1
for i in range(l-1):
j = nums[i+1] - nums[i]
print(nums[i+1],nums[i],tmp)
if j == 1:
tmp += 1
elif j == 0:
continue
elif tmp > 1:
if tmp >= result:
result = tmp
tmp = 1
return max(tmp,result)
总体上解题思路有些固定。当然,通过set的方式可以简化代码,但是没酱紫快
哈希解法
1、用哈希表存储每个端点值对应连续区间的长度
2、若数已在哈希表中:跳过不做处理
3、若是新数加入:
取出其左右相邻数已有的连续区间长度 left 和 right
计算当前数的区间长度为:cur_length = left + right + 1
根据 cur_length 更新最大长度 max_length 的值
更新区间两端点的长度值
class Solution(object):
def longestConsecutive(self, nums):
hash_dict = dict()
max_length = 0
for num in nums:
if num not in hash_dict:
left = hash_dict.get(num - 1, 0)
right = hash_dict.get(num + 1, 0)
cur_length = 1 + left + right
if cur_length > max_length:
max_length = cur_length
hash_dict[num] = cur_length
hash_dict[num - left] = cur_length
hash_dict[num + right] = cur_length
return max_length
标签:tmp,cur,nums,算法,length,num,dict,序列,最长
From: https://blog.csdn.net/qq_42691309/article/details/137087209