659. Split Array into Consecutive Subsequences
You are given an integer array sorted in ascending order (may contain duplicates), you need to split them into several subsequences, where each subsequences consist of at least 3 consecutive integers. Return whether you can make such a split.
Example 1:
Input: [1,2,3,3,4,5] Output: True Explanation: You can split them into two consecutive subsequences : 1, 2, 3 3, 4, 5
Example 2:
Input: [1,2,3,3,4,4,5,5] Output: True Explanation: You can split them into two consecutive subsequences : 1, 2, 3, 4, 5 3, 4, 5
Example 3:
Input: [1,2,3,4,4,5] Output: False
Note:
- The length of the input is in range of [1, 10000]
1、这个题的方式就是构造出拆分后的情况。
2、构造方式是从最后一行最后一个来看:
如果是nums[i] = vv[row-1][col-1] + 1 ,刚好加在后面
如果是nums[i] = vv[row-1][col-1] 。那就往上面找,看能否加在某个序列后面 。如果不行就新建序列。
3、最后挨个看序列的长度。
class Solution {
public:
bool isPossible(vector<int>& nums)
{
if (nums.size() < 3) return false;
vector<vector<int>> vv(1, vector<int>(1, nums[0]));
for (int i = 1; i < nums.size(); i++)
{
int row = vv.size();
if (nums[i] == vv[row-1][vv[row-1].size() - 1] + 1)
{
vv[row-1].push_back(nums[i]);
continue;
}
else if (nums[i] == vv[row-1][vv[row-1].size() - 1])
{
int now_row = row;
while (now_row >= 1 && nums[i] == vv[now_row-1][vv[now_row-1].size() - 1])
{
now_row --;
}
if (now_row == 0 || nums[i] != vv[now_row-1][vv[now_row-1].size() - 1] + 1) //当到了最上面 或者 不能加在当前行 需要重新启动一行
{
vv.push_back(vector<int>(1, nums[i]));
continue;
}
else //往上面找 找到了与当前行前面 相等的。 且可以加在后面
{
vv[now_row-1].push_back(nums[i]);
continue;
}
}
}
for (auto it : vv)
{
if (it.size() < 3)
return false;
}
return true;
}
};