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]++;
}
else
return false;
}
return true;
}
};