- 问题来源
- 问题简介
给你一个有序数组(允许重复数字出现),要求把他分成若干个连续的无重复数字的数组,且每个数组长度需大于3。
解题思路
从左到右遍历,则对于每次遍历的数字
- 若是连续的
- 将该数字添加到可添加的长度最小的数组中
- 若是重复的或者不连续的
- 新开一个数组储存
- 若该数字与某个新开数组的最大值不为连续且该新开数组长度小于3
- 由于所遍历的数组是有序的,则之后遍历的数字都将无法被添加到该新开数组中,则表示分解操作失败
时间复杂度 | 空间复杂度 |
---|---|
O(未知) | O(未知) |
Code
class Solution {
public:
bool isPossible(vector<int>& nums) {
int s = 0, e = nums.size();
vector<stack<int>> severals;
int minIndex = severals.size(), minSize = e;
vector<int> canAdd;
for (;s != e;s++) {
canAdd.clear();
minIndex = severals.size();
minSize = e;
for (int i = 0; i < severals.size(); i++) {
int top = severals[i].top(), s_s = severals[i].size();
if (top != nums[s]) {
if (nums[s] - top <= 1) {
canAdd.push_back(i);
if (s_s < minSize) {
minIndex = i;
minSize = s_s;
}
} else if (s_s < 3) {
return false;
}
}
}
if (!canAdd.size()) {
severals.push_back(stack<int>());
minSize = 0;
}
severals[minIndex].push(nums[s]);
}
bool valid = true;
for (int i = 0; i < severals.size(); i++) {
if (severals[i].size() < 3) {
valid = false;
break;
}
}
return valid;
}
};