[leetcode]Split Array into Consecutive Subsequences
链接:https://leetcode.com/problems/split-array-into-consecutive-subsequences/
Question
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]
Solution
// 维护两个map,分别是记录每个字符个数freq和队列当中下一个需要的字符个数need
// 举个例子,比如有队列[1,2,3]和[2,3,4]则need[4]=1且need[5]=1,因为[1,2,3]下一步需要4,[2,3,4]下一步需要5
class Solution {
public:
bool isPossible(vector<int>& nums) {
unordered_map<int, int> freq, need;
for (auto x: nums) freq[x]++;
for (auto x: nums) {
if (!freq[x]) continue;
else if (need[x] > 0) { // 有序列需要x
need[x+1]++;
need[x]--;
freq[x]--;
} else if (freq[x+1] > 0 && freq[x+2] > 0) { // 确保可以形成三个字符
freq[x]--;
freq[x+1]--;
freq[x+2]--;
need[x+3]++;
} else return false;
}
return true;
}
};
思路:通过freq和need进行维护,对于一个字符,先看是否可以加入到已存在的序列中;如果不行,直接和后面的字符创建一个长度为3的序列;如果还不行,直接返回false。