【leetcode】659. Split Array into Consecutive Subsequences

题目如下:

解题思路:本题可以维护三个字典,dic_1保存没有组成序列的单元素,dic_2保存组成了包含两个元素的序列中的较大的元素,dic_3保存组成了包括三个或者三个以上元素的序列中的最大值。因为合法的序列至少要三个元素,解题的关键是要使得dic_2和dic_1的元素尽快满足条件。对于任意一个还没有加入字典的元素,加入字典的优先级从高到低排序分别是dic_2 > dic_1 > dic_3,即优先匹配dic_2,接下来匹配dic_1,再就是dic_3,如果三个都不满足,说明在目前条件下市落单的元素,加入dic_1。这里需要主要的是如果匹配上了dic_2,那么会把这个序列从dic_2中移除,加入dic_3;同理匹配dic_1的话则将dic_1移除加入dic_2。

代码如下:

class Solution(object):
    def isPossible(self, nums):
        dic_1 = {}
        dic_2 = {}
        dic_3 = {}
        for i in nums:
            if i-1 in dic_2:
                dic_2[i-1] -= 1
                if dic_2[i-1] == 0:
                    del dic_2[i-1]
                if i in dic_3:
                    dic_3[i] += 1
                else:
                    dic_3[i] = 1
            elif i-1 in dic_1:
                dic_1[i - 1] -= 1
                if dic_1[i - 1] == 0:
                    del dic_1[i - 1]
                if i in dic_2:
                    dic_2[i] += 1
                else:
                    dic_2[i] = 1
            elif i-1 in dic_3:
                dic_3[i - 1] -= 1
                if dic_3[i - 1] == 0:
                    del dic_3[i - 1]
                if i in dic_3:
                    dic_3[i] += 1
                else:
                    dic_3[i] = 1
            else:
                if i in dic_1:
                    dic_1[i] += 1
                else:
                    dic_1[i] = 1
        #print dic_1,dic_2,dic_3
        for k,v in dic_1.iteritems():
            if k-1 not in dic_3 or dic_3[k-1] < v:
                return False
            dic_3[k-1] -= v

            dic_1[k] = 0

            if k in dic_3:
                dic_3[k] += v
            else:
                dic_3[k] = 1


        for k,v in dic_2.iteritems():
            if k-2 not in dic_3 or dic_3[k-2] < v:
                return False
            dic_3[k-2] -= v

            dic_2[k] = 0

            if k in dic_3:
                dic_3[k] += v
            else:
                dic_3[k] = 1

        return True

 

转载于:https://www.cnblogs.com/seyjs/p/9590537.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值