《Leetcode of December》659. 分割数组为连续子序列

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表来模拟贪心算法。

猜你喜欢

转载自blog.csdn.net/weixin_37724529/article/details/110633345