LeetCode 659. Split Array into Consecutive Subsequences

很有意思的一道题,对于每一个element,我们有两种选择:

1. 把它加入之前构造好的顺子中

2. 用它新开一个顺子

此处用贪心策略,如果1能满足总是先满足1,因为新开顺子可能失败,即使新开顺子成功,当1能满足的时候,将新开顺子加入之前的顺子也能成功,所以能够选择策略1的时候没必要冒风险选择策略2。

因此我们需要一个hashtable来记录顺子结尾到哪了,同时也要知道各个元素的frequency,由此判断能不能够开新顺子。

class Solution {
public:
    bool isPossible(vector<int>& nums) {
        unordered_map<int,int> count;
        for (int num:nums) ++count[num];
        
        unordered_map<int,int> tails; // tail needed -> num
        for (int num:nums){
            if (count[num]==0) continue;
            --count[num];
            if (tails[num]>0){ // append to an existing sequence
                --count[num];
                --tails[num]==0;
                ++tails[num+1];
            }else{ // start a new sequence
                --count[num];
                if (count[num+1] && count[num+2]){
                    --count[num+1]; --count[num+2];
                    ++tails[num+3];
                }else return false;
            }
        }
        return true;
    }
};

时间复杂度 O(n)

猜你喜欢

转载自www.cnblogs.com/hankunyan/p/11495248.html