思路
因为前面的分组的人数和总和都要小于后面的,所以先把数组排序,再用贪心的思路,如果当前的分组不能满足要求,则扩大分组的大小直到到达上限。
代码
class Solution {
public:
int maximumGroups(vector<int>& grades) {
int n=grades.size();
sort(grades.begin(),grades.end());
//前缀和优化
vector<long long>sum(n+1,0);
for(int i=0;i<n;i++){
sum[i+1]=sum[i]+grades[i];
}
//定义分组数,上一个分组的总和,上一个分组的大小
int groupNum=0,groupSum=0,groupSize=0;
for(int i=0;i<n;i+=groupSize){
int requireSize=groupSize+1;
if(i+requireSize>n)break;
//不满足要求则扩容直到符合要求或者超出范围
while(sum[i+requireSize]-sum[i]<=groupSum){
if(i+requireSize>n)break;
requireSize++;
}
//判断是否是超出了范围
if(sum[i+requireSize]-sum[i]<=groupSum)break;
//更新
groupSize=requireSize;
groupNum++;
groupSum=sum[i+requireSize]-sum[i];
}
return groupNum;
}
};