Description
Solution
分割出来的子序列需要尽可能的长,所以我们对于每个数,都贪心的放入目前放入的最短的子序列即可
采用离散化+优先队列实现
时间复杂度 O ( N ∗ log N ) O(N* \log N) O(N∗logN)
Code
class Solution {
public:
int mp[3*10007];
priority_queue<int,vector<int>,greater<int> >q[3*10007];
bool isPossible(vector<int>& nums) {
int sz = nums.size(), tot = 0, res = 0;
for(int i = 0;i < sz;++i) {
mp[++tot] = nums[i];
mp[++tot] = nums[i]+1;
mp[++tot] = nums[i]-1;
}
sort(mp+1,mp+1+tot);
tot = unique(mp+1,mp+1+tot) - mp - 1;
for(int i = 0;i < sz;++i) {
int x = nums[i];
int pos = lower_bound(mp+1,mp+1+tot,x) - mp;
if(q[pos-1].size() == 0) {
q[pos].push(1);
res++;
}else {
int cnt = q[pos-1].top();q[pos-1].pop();
if(cnt < 3) res--;
q[pos].push(cnt+1);
if(cnt + 1 < 3) res++;
}
}return res==0;
}
};