128.最长连续序列
题目
给定一个未排序的整数数组nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度
进阶:你可以设计并实现复杂度为o(n)的方案吗?
示例1:
输入:nums=[100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是【1,2,3,4】。它的长度为4
示例2:
输入:nums=【0,3,72,5,8,4,6,0,1】
输出:9
一开始我的想法是用暴力法解决,就是先用冒泡排序把数组给排好,然后再遍历排序好的数组,看相邻元素是否相差1,如果不是,就截取那个位置,返回长度。
class Solution(object):
def longestConsecutive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums: return 0
for i in range(0,len(nums)-1):
for j in range(0,len(nums)-i-1):
if nums[j]>nums[j+1]:
t =nums[j]
nums[j]=nums[j+1]
nums[j+1]=t
print(nums)
# nums=list(set(nums))
mark=0
for k in range(len(nums)-1):
if abs(nums[k+1]-nums[k])==1:
mark+=1
return mark+1
这个代码可以通过以上两个测试用例,但是却不能通过最终测试,原因是,其余测试会出现,如果出现负数,恐怕会失效。
所以我还是看了答案思路。借助集合筛选重复元素,并初始化列表长度,用一个变量存储当前值,并判断与这个当前值相差1的元素是否在集合中,如果有,则统计长度加1,目的是判断相邻元素的个数,个数就是返回的长度
class Solution(object):
def longestConsecutive(self,nums):
if not nums: return 0
max_len=0
hashmap=set(nums)
for i in range(len(nums)):
if nums[i]-1 not in hashmap:
leng=1
cur=nums[i]
while cur+1 in hashmap:
cur+=1
leng+=1
max_len=max(leng,max_len)
return max_len
测试用例
def longestConsecutive(nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums: return 0
max_len=0
hashmap=set(nums)
for i in range(len(nums)):
if nums[i]-1 not in hashmap:
leng=1
cur=nums[i]
while cur+1 in hashmap:
leng+=1
cur+=1
max_len=max(max_len,leng)
return max_len
nums=[0,3,7,2,5,8,4,6,0,1]
print(longestConsecutive(nums))