给你一个按升序排序的整数数组num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 。

如果可以完成上述分割,则返回true;否则,返回false

示例1:

输入: [1,2,3,3,4,5]

输出: True

解释: 可以分割出[1,2,3],[3,4,5]

示例2:

输入: [1,2,3,3,4,4,5,5]

输出: True

解释: 可以分割出[1,2,3,4,5],[3,4,5]

示例1:

输入: [1,2,3,3,4,4,5]

输出: False

思路:

主要是利用hash map和小根堆的特性,借助<key:int, value:min_heap>来帮助我们记录以key结尾的所有序列的长度,选择一个短的加入进去。最后,遍历map,看是否有不符合的队列存在。

代码:

typedef priority_queue<int, vector<int>, greater<int>> min_heap;
class Solution {
public:
    bool isPossible(vector<int>& nums) {
        int N = nums.size();
        if (N < 3) return false;
        unordered_map<int, min_heap> m;
        for (auto &n : nums) {
            if (!m.count(n)) m[n] = min_heap();
            if (m.count(n-1)) {
                m[n].push(m[n-1].top() + 1);
                m[n-1].pop();
                if (m[n-1].empty()) {
                    m.erase(n-1);
                }
            } else {
                m[n].push(1);
            }
        
        for (auto &it : m) {
            if (it.second.top() < 3) return false;
        }
        return true;
    }
};