输入一个按升序排序的整数数组(可能包含重复数字),你需要将它们分割成几个子序列,其中每个子序列至少包含三个连续整数。返回你是否能做出这样的分割?
示例 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]
思路:
贪心算法
我们维持两个map,freq记录每个数字出现的次数,need记录这个数字可以跟在已有序列后面的次数
freq[num]=0,则跳过这次循环。
class Solution {
public:
bool isPossible(vector<int>& nums)
{
if (nums.size() < 3)
return false;
map<int, int>freq;//记录对应数字出现的次数
map<int, int>need;//need是对应数字待拼接的次数
for (int i = 0; i < nums.size(); ++i)
freq[nums[i]]++;
for (int i = 0; i < nums.size(); ++i)
{
if (!freq[nums[i]])
continue;
else if (need[nums[i]]>0)
{
need[nums[i]]--;
need[nums[i] + 1]++;
}
else if (freq[nums[i]+1]>0 && freq[nums[i]+2] > 0)//做序列的开头
{
freq[nums[i] + 1]--;
freq[nums[i] + 2]--;
need[nums[i] + 3]++;
}
else return false;
freq[nums[i]]--;
}
return true;
}
};