给你一个按升序排序的整数数组 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
先判断能否接到已有的子序列后面(因为对v的需求大于0,所以v是可以接到已有的序列后面
再判断能否以v开头组成一个长度为3的子序列
如果以上都不满足,则无法分割成功
为什么要先判断是否可以接到已有的子序列中?
因为如果能接进去,那么这个子序列肯定是满足条件的(连续且长度大于等于3),而如果让它当开头,却不一定能组成一个长度为3的子序列。
class Solution {
public:
bool isPossible(vector<int>& nums) {
unordered_map<int,int> freq,need;
//记录nums中数字的个数
for(int v:nums)
{
freq[v]++;
}
for(int v:nums)
{
if(freq[v]==0)//如果数v已经被前面的子序列用完了,那么直接跳过
{
continue;
}
//先判断能否接到已有的子序列后面(因为对v的需求大于0,所以v是可以接到已有的序列后面的)
if(need[v]>0)
{
freq[v]--;//v的数量下降一
need[v]--;//对v的需求减一
need[v+1]++;//对v+1的需求加一
}
//再判断能否以v开头组成一个长度为3的子序列
//如果前面if语句执行成功,则不会执行else if,所以是有判断的先后顺序的
else if(freq[v]>0&&freq[v+1]>0&&freq[v+2]>0)
{
freq[v]--;//v的数量下降一
freq[v+1]--;//...
freq[v+2]--;//...
need[v+3]++;//对v+3的需求加一
}
else//如果以上都不满足,则无法分割成功
{
return false;
}
}
return true;
}
};