问题描述:
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.
示例:
Input: [1,2,3,3,4,5] Output: True Explanation: You can split them into two consecutive subsequences : 1, 2, 3 3, 4, 5 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 Input: [1,2,3,4,4,5] Output: False
Note:
The length of the input is in range of [1, 10000]问题分析:
参考大神的博客:https://www.cnblogs.com/pk28/p/7384602.html
对于任何一个数,要么它能添加进现在有的分割中去,要么它能形成新的分割,如果两种情况都不满足,那么该数组不能形成有效的分割。
过程详见代码:
class Solution { public: bool isPossible(vector<int>& nums) { int n = nums.size(); if (n < 3) return false; unordered_map<int, int> mp, mp2; for (int i = 0; i < n; ++i) mp[nums[i]]++; for (int i = 0; i < n; i++) { int x = nums[i]; if (mp[x] <= 0) continue; if (mp2[x - 1] > 0) mp[x]--, mp2[x - 1]--, mp2[x]++; else if (mp[x + 1] >0 && mp[x + 2] > 0) { mp[x]--, mp[x + 1]--, mp[x + 2]--; mp2[x + 2]++; } else return false; } return true; } };