659. Split Array into Consecutive Subsequences

来源:互联网 发布:阿里云域名实名认证 编辑:程序博客网 时间:2024/05/21 17:03

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: TrueExplanation:You can split them into two consecutive subsequences : 1, 2, 33, 4, 5

Example 2:

Input: [1,2,3,3,4,4,5,5]Output: TrueExplanation:You can split them into two consecutive subsequences : 1, 2, 3, 4, 53, 4, 5

Example 3:

Input: [1,2,3,4,4,5]Output: False

Note:

  1. 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;}