659. Split Array into Consecutive Subsequences(贪心)

1.题目描述

2.代码

思想:对每一个可能的序列都创建一个容器保存起来,记录它的序列尾,每次查询可匹配的队列尾部,优先匹配那些当前序列长度小于3的序列。比如:对于待拆分的 1233445 ,会生产这样的序列 123 3 ,当4到来时,优先匹配 3 (请思考为什么要这样?),这样,遍历结束后,如果有哪一个序列的长度是小于3的,说明不存在这样的拆分。

优化:而实际上我们并不需要维护这样的一些序列,从上面分析看出,我们注重的信息只是序列的尾元素n及其长度 size ,所以,对每个序列,我们需要维护的仅此两个变量。

实现:通过使用尾元素作为 key 的map容器 backs ,小顶堆的优先队列,则 backs[key] 记录序列尾元素值为 key 所有序列的长度,以同样元素结尾的不停长度的(序列)就这样被维护在一个 vector ,且长度较小的放在优先队列的头部,匹配的时候优先出列。再者,维护一个当前有多少序列的长度小于3的变量 SquenceSizeLess3 ,最终依靠这样变量判断是否拆分成功。

class Solution {
public:
    bool isPossible(vector<int>& nums) {
        //小顶堆,小的元素作为队列头 
        unordered_map<int, priority_queue<int, vector<int>, std::greater<int>>> backs;
        //记录有多少个squence的长度小于3 
        int SquenceSizeLess3 = 0;

        for(int num : nums) {
            if(!backs[num - 1].empty()) {
                int size = backs[num - 1].top();
                backs[num - 1].pop();
                backs[num].push(++size);

                if(size == 3)
                    SquenceSizeLess3--;
            } else {
                //找不到可匹配的队尾,创建新的squence 
                backs[num].push(1);
                SquenceSizeLess3++; 
            } 
        }
        return SquenceSizeLess3 == 0; 

    }
};

参考:leetcoe上的discussion
联系邮箱:sysuygm@163.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值