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