leetcode-6133:分组的最大数量

本文探讨了解决LeetCode 6133问题的两种方法:一种是巧妙利用脑筋急转弯思想,通过等差数列推算最大组数;另一种是采用排序和贪心算法,按成绩和学生数递增分组。两种方法对比,适合不同场景和理解水平。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

题目连接

给你一个正整数数组 grades ,表示大学中一些学生的成绩。你打算将 所有 学生分为一些 有序 的非空分组,其中分组间的顺序满足以下全部条件:

第 i 个分组中的学生总成绩 小于 第 (i + 1) 个分组中的学生总成绩,对所有组均成立(除了最后一组)。
第 i 个分组中的学生总数 小于 第 (i + 1) 个分组中的学生总数,对所有组均成立(除了最后一组)。
返回可以形成的 最大 组数。

示例 1:

输入:grades = [10,6,12,7,3,5]
输出:3
解释:下面是形成 3 个分组的一种可行方法:
-1 个分组的学生成绩为 grades = [12] ,总成绩:12 ,学生数:1
-2 个分组的学生成绩为 grades = [6,7] ,总成绩:6 + 7 = 13 ,学生数:2
-3 个分组的学生成绩为 grades = [10,3,5] ,总成绩:10 + 3 + 5 = 18 ,学生数:3 
可以证明无法形成超过 3 个分组。

示例 2:

输入:grades = [8,8]
输出:1
解释:只能形成 1 个分组,因为如果要形成 2 个分组的话,会导致每个分组中的学生数目相等。

解题

方法一:脑筋急转弯

如果从小到大排序
那么每次取 1个、2个、3个… 就能得到最大的能取得的数量
而根grades具体是什么值,没有任何关系。
因此假设grades的值,是1、2、3、4、5、6、7…
第二次取2个元素,得到的分组和一定是大于第一次取的1个元素

n为所有元素个数
用等差数列计算 (首项+末项)*项数/2<=n
计算得到最大组数x即可
在这里插入图片描述

class Solution {
public:
    int maximumGroups(vector<int>& grades) {
        int len=grades.size();
        return sqrt(2*len+0.25)-0.5;
    }
};

方法二:排序+贪心

从小到大排序
取1个、2个、3个…以此类推
计算能取得最大组数

class Solution {
public:
    int maximumGroups(vector<int>& grades) {
        sort(grades.begin(),grades.end());
        int res=1,n=grades.size();
        
        int preVal=grades[0];
        int preCount=1;
        
        int curVal=0;
        int curCount=0;

        int i=1;
        while(i<n){
            while(true){
                if(curCount>preCount&&curVal>preVal) break;
                if(i==n) return res;
                curVal+=grades[i];
                curCount++;
                i++;
            }
            
            res++;
            preVal=curVal;
            preCount=curCount;
            
            curVal=0;
            curCount=0;
            
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菊头蝙蝠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值