class Solution:
def isPossible(self, nums: List[int]) -> bool:
#dic表示n出现的次数
dic={}
for i in nums:
dic[i] = dic.get(i,0)+1
#如果仅有两个数字肯定不能完成长度至少为3的分割
size = len(dic)
if len(dic)<3:
return False
#end这个hash表存放的是以n结尾的元素出现的次数(长度至少大于3),end[n]代表以n结尾的子序列的个数
end = defaultdict(int)
#遍历num数组
for i in nums:
#如果dic[i]=0,直接跳过
if dic[i]==0:
continue
#否则dic[i]-1
dic[i]-=1
#如果以i-1结尾的子序列存在
if end.get(i-1,0)>0:
#那么i-1结尾的子序列个数减1,以i结尾的子序列个数加1
end[i-1]-=1
end[i]+=1
#如果以i-1结尾的子序列不存在,构建以i+2结尾的子序列
elif dic.get(i+1,0)>0 and dic.get(i+2,0)>0:
dic[i+1]-=1
dic[i+2]-=1
end[i+2] = end.get(i+2,0)+1
#如果都不满足就返回False
else:
return False
return True
- 使用两个hash表
- hash1用来统计每个元素出现的个数
- hash2用来统计以n结尾的子序列的个数
- 如果子序列存在,那就给他添加一个然后更新hahs2
- 如果子序列不存在,那么就构建子序列(长度必须大于等于3)
- 如果都不满足就返回False
总结:用两个hash表来模拟贪心算法。