Leetcode:128最长连续序列
程序员文章站
2024-02-25 09:41:28
...
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是[1, 2, 3, 4]。它的长度为 4。
思路:时间复杂度为O(n),排除排序;以开辟空间来节约时间,引入哈希表,一次遍历得到数组各个位置对应的连续序列长度。即键:数组的元素,值:连续序列长度。
分解示意图:
第一步,哈希表插入100,对应连续序列长度为 left(100-1)的值+right(100+1)值+1 :lenth = dic[left]+dic[right]+1
key | 99(不存在) | 100(insert) | 101(不存在) | |
val | 0 | 0+0+1 | 0 |
遍历到数组最后一个元素2时:
key | 1 | 2 | 3(insert) | 4 | |
val | 2 | 2 | 2+1+1 | 1 |
得出此时lenth = 2+1+1=4
此时应该更改其最左和最右端的lenth值
key | 1 | 2 | 3(insert) | 4 | |
val | 4 | 4(2) | 4(whatever) | 4 |
注意:中间的值不会再访问,所以任取即可。序列端点的值需要准确计算。
完整代码:
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
dic = {}
maxi = 0
for num in nums:
if num not in dic:
left,right = dic.get(num-1,0),dic.get(num+1,0)
lenth = left+right+1
#随机设定即可,但确保有值,不重复计算其左右,连续区间端点值确定即可,也可以将内部设定为统一值
dic[num] = 0#lenth
dic[num-left]=lenth
dic[num+right]=lenth
maxi = max(maxi,lenth)
return maxi
上一篇: 最长回文串——多种方法,未完待续
下一篇: Leetcode 128最长连续序列