659. 分割数组为连续子序列

输入一个按升序排序的整数数组(可能包含重复数字),你需要将它们分割成几个子序列,其中每个子序列至少包含三个连续整数。返回你是否能做出这样的分割?

示例 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;
	}
};

猜你喜欢

转载自blog.csdn.net/qq_43069546/article/details/87791673