Split Array into Consecutive Subsequences 解法

Split Array into Consecutive Subsequences 解法


第七周题目
难度:Media
LeetCode题号:659

题目

Description:

You are given an integer array sorted in ascending order (may contain duplicates), you need to split them into several subsequences, where each subsequences consist of at least 3 consecutive integers. Return whether you can make such a split.
Example1:

Input: [1,2,3,3,4,5]
Output: True
Explanation:
You can split them into two consecutive subsequences :
1, 2, 3
3, 4, 5

Example2:

Input: [1,2,3,3,4,4,5,5]
Output: True
Explanation:
You can split them into two consecutive subsequences :
1, 2, 3, 4, 5
3, 4, 5

Example3:

Input: [1,2,3,4,4,5]
Output: False


思考

进行两次遍历,第一次找出每个数字出现的频率,第二次切割子串。
通过unordered_map来处理,声明count用来保存数字 i 出现频率,tail用来保存以数字 i 结尾的子串的个数。
第二次循环遍历时,首先判断这个数“i”是否还已经被切割完了
若还在,向后判断他的后一个数是否是结束符,如果是,则后一个数tail值减一,当前数的tail值加一;
如果后一个数不是结束符,说明在他前面当前这个数不能并如果前面的串了,要向后发展。
判断后两个数是否存在,存在的话就抽取了后两个数(让他们的count值减一),然后让第三个数的tail值加一
如果以上情况都不存在,则说明如果构成符合题意的子串,返回false


代码

class Solution {
public:
    bool isPossible(vector<int>& nums) {
        unordered_map<int, int> tail, count;
        for (int &i : nums) {
            count[i]++;
        }

        for (int &i : nums) {
            if (!count[i]) {
                continue;
            }
            count[i]--;
            if (tail[i-1] > 0) {
                tail[i-1]--;
                tail[i]++;
            } else if (count[i+1] && count[i+2]) {
                tail[i+2]++;
                count[i+1]--;
                count[i+2]--;
            } else {
                return false;
            }
        }
        return true;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值