很有意思的一道题,对于每一个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)