2358. 分组的最大数量

72 阅读1分钟

思路

因为前面的分组的人数和总和都要小于后面的,所以先把数组排序,再用贪心的思路,如果当前的分组不能满足要求,则扩大分组的大小直到到达上限。

代码

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