这是LeetCode周赛中的一道题,题目描述为:
输入为:一个整数数组 nums 和一个正整数 k
返回值:如果可以把这个数组划分成一些由 k 个连续数字组成的集合,返回True;否则,返回False
举例:nums = [1,2,3,3,4,4,5,6], k=4 可以被分为[1,2,3,4]; [3,4,5,6],所以返回True
nums = [1,2,3,4] ;k=3, 不能被划分,所以返回False
一开始我用很容易想到的方式解决,但是测试用例中,有一个容量很大的数组,其中前n个数是1,剩下n+3个数是2,这样就会超出时间限制。因此最后使用C++里的map解决了这个问题。
bool isPossibleDivide(vector<int>& nums, int k) {
int vec_len = nums.size();
//如果数组个数不能被k整除。结果数组肯定不会被均分的。
if(vec_len%k!=0)
return false;
vector<int> sorted_nums = nums;
sort(sorted_nums.begin(), sorted_nums.end()); //排序
//使用map,其中key为nums里的数字,value为该数字存在的次数
map<int, int> mp;
for(int i=0;i<vec_len;i++)
mp[sorted_nums[i]] ++;
for(int i=0;i<vec_len;i++)
{
//如果某个数字出现的次数不为0,那么比这个数字大0~k以内的数字也必须存在
if(mp[sorted_nums[i]]!=0)
{
for(int j=0;j<k;j++)
{
if(mp[sorted_nums[i]+j]==0) //比这个数字大0~k的数字也必须存在
return false; //否则返回false
mp[sorted_nums[i]+j]--; //这个数字被使用一次,因此次数减1
}
}
}
return true;
}
C++.划分数组为连续数字的集合
原文:https://www.cnblogs.com/why1012/p/12083845.html