这道题目在官方解法中使用的是哈希表,但因为我想要学一下并查集,所以这里采用的是并查集写法
思路:
首先要求找到,最长连续序列,如1,2,3,4,5
可知,相差绝对值==1的是可以放在一个区域内的
这就变成了连通性问题,即abs(差)==1则连通,否则不连通
那么可使用并查集,解决该问题
同时在这个过程中nums[i]可能达到10**9所以采用下标替代(hash映射)
只要相减==1就可以连在一起
题目
class UFS:
def __init__(self,n):
self.parent=[0]*(n+1)
self.sizeset=[1]*(n+1)
for i in range(n):
self.parent[i]=i
def find(self,node):
father=self.parent[node]
if node==father:
return node
self.parent[node]=self.find(father)
return self.parent[node]
def union(self,head_a,head_b):
father_a=self.find(head_a)
father_b=self.find(head_b)
if father_a!=father_b:
self.parent[father_a]=father_b
self.sizeset[father_b]+=self.sizeset[father_a]
def fun1(nums):
if nums == []:
return 0
hash = {}
for i in range(len(nums)):
hash[nums[i]] = i
n = len(nums)
ufs = UFS(n)
for key, value in hash.items():
if key - 1 in hash:
ufs.union(hash[key - 1], value)
if key + 1 in hash:
ufs.union(hash[key + 1], value)
max_ = 0
for item in ufs.sizeset:
max_ = max(item, max_)
return max_