给你一个按升序排序的整数数组 num
(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 。
如果可以完成上述分割,则返回 true
;否则,返回 false
。
示例 1:
输入: [1,2,3,3,4,5]
输出: True
解释:
你可以分割出这样两个连续子序列 :
1, 2, 3
3, 4, 5
示例 2:
输入: [1,2,3,3,4,4,5,5]
输出: True
解释:
你可以分割出这样两个连续子序列 :
1, 2, 3, 4, 5
3, 4, 5
示例 3:
输入: [1,2,3,4,4,5]
输出: False
提示:
- 输入的数组长度范围为
[1, 10000]
解答
出差没时间做,先贴官方题解,待补充:
贪心,遍历到数字x
时,只要存在以x-1
结尾的子序列,就将其添加上去,反之新建一个以x
为首的子序列。
class Solution {
public:
bool isPossible(vector<int>& nums) {
// 记录每个数字需要添加到多少个子序列中
unordered_map<int, int> countMap;
// 记录每个数字作为子序列结尾的次数
unordered_map<int, int> endMap;
for (auto& x : nums) {
countMap[x] += 1;
}
for (auto& x : nums) {
// 需要将其添加到一个子序列中
if (countMap[x] > 0) {
// 存在以 x-1 结尾的子序列
if (endMap[x - 1] > 0) {
countMap[x] -= 1;
endMap[x - 1] -= 1;
endMap[x] += 1;
}
// 不存在以 x-1 结尾的子序列。因此需要以 x 为首新建一个子序列
// 并且为了保证长度至少为3,所有需要存在 x+1, x+2
else {
if (countMap[x + 1] > 0 && countMap[x + 2] > 0) {
countMap[x] -= 1;
countMap[x + 1] -= 1;
countMap[x + 2] -= 1;
endMap[x + 2] += 1;
} else {
return false;
}
}
}
}
return true;
}
};