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;
}
};
本文介绍了一种算法,用于判断一个已排序的整数数组是否能被拆分成若干个连续子序列,每个子序列至少包含3个连续整数。通过实例演示了如何实现这一算法,并提供了详细的步骤说明。
282

被折叠的 条评论
为什么被折叠?



