leetcode 659. Split Array into Consecutive Subsequences
思路:模拟(有点慢)。
对于1 2 3 4 4 5 6样例;
先分成 1 2 3 4 5 6 和 4。
第一个序列满足条件。
第二个序列小于三个,从前面的所有序列找到5,把5 6移到第二个序列。
以此类推。
class Solution {
public:bool isPossible(vector<int>& nums) {vector<vector<int>> a;for (int i = 0; i < nums.size(); i++){int flag = 0;for (int j = 0; j < a.size(); j++){if (a[j].size()>0 && a[j].back() + 1 == nums[i]){a[j].push_back(nums[i]);flag = 1;break;}}if (flag == 0){a.push_back(vector<int>{nums[i]});}}for (int i = 0; i < a.size();i++){if (a[i].size() < 3){int flag = 0;for (int j = 0; j < i; j++){vector<int>::iterator it = find(a[j].begin(), a[j].end(), a[i].back() + 1) ;if (it != a[j].end() && it - a[j].begin() >= 3 && a[i].size() + (a[j].end()-it) >=3){int num = 0;for (vector<int>::iterator it1 = it; it1 != a[j].end(); it1++){num++;a[i].push_back(*it1);}for (; num >= 1;num--)a[j].pop_back();flag = 1;break;}}if (flag == 0)return false;}}}
};
思路二:
用ends[i]表示以i为结尾地队列的数量;
用count[i]表示数字i出现地次数。
对于任意一个数n,我们有两个安排方式,
1:只要有n-1结尾的队列,放在这个队列
2:只要有n+1,n+2两个数,新建n,n+1,n+2的队列
3:没地方放,返回。
为什么不考虑n-1,n,n+1,因为数字是升序排列的。
class Solution {
public:bool isPossible(vector<int>& nums) {map<int, int>count,ends;for (int i = 0; i < nums.size(); i++)count[nums[i]]++;for (int i = 0; i < nums.size(); i++){if (count[nums[i]] == 0) continue;if (ends[nums[i] - 1]){ends[nums[i] - 1]--;ends[nums[i]]++;count[nums[i]]--;}else if (count[nums[i] + 1] && count[nums[i] + 2]){count[nums[i]]--;count[nums[i] + 1]--;count[nums[i] + 2]--;ends[nums[i] + 2]++;}elsereturn false;}return true;}
};