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。若找不到这样的队列,新创建一个队列,把 新元素放入。待所有元素都放入后,看是否所有队列的长度都不小于3.
code
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
bool isPossible(vector<int>& nums) {
vector<vector<int> > v;
v.push_back(vector<int>());
v[0].push_back(nums[0]);
for (int i = 1; i < nums.size(); ++i) {
int flag=0;
for (int j = v.size()-1; j >= 0; --j) {
if (nums[i]==v[j].back()+1) {
v[j].push_back(nums[i]);
flag=1;
break;
}
}
if (flag==0) {
v.push_back(vector<int>());
v.back().push_back(nums[i]);
}
}
for (int i = 0; i < v.size(); ++i)
if (v[i].size() < 3) return false;
return true;
}
};
int main(int argc, char const *argv[])
{
int a[]={1,2,3,3,4,5};
vector<int> nums(a,a+6);
Solution s;
cout << s.isPossible(nums);
return 0;
}