leetcode 304周赛补题

T1:使数组中所有元素都等于零
给你一个非负整数数组 nums 。在一步操作中,你必须:

选出一个正整数 x ,x 需要小于或等于 nums 中 最小 的 非零 元素。
nums 中的每个正整数都减去 x。
返回使 nums 中所有元素都等于 0 需要的 最少 操作数。

示例 1:

输入:nums = [1,5,0,3,5]
输出:3
解释:
第一步操作:选出 x = 1 ,之后 nums = [0,4,0,2,4] 。
第二步操作:选出 x = 2 ,之后 nums = [0,2,0,0,2] 。
第三步操作:选出 x = 2 ,之后 nums = [0,0,0,0,0] 。
示例 2:

输入:nums = [0]
输出:0
解释:nums 中的每个元素都已经是 0 ,所以不需要执行任何操作。

仔细理解题目可以发现,因为每次选最小的数进行操作,所以每一次操作一定有一个数可以变为零。相当于操作一次将数组中相同的一类数变为零,所以题目最终转化为统计数组中有多少个互不相同的数。unordered_set容器 不以键值对的形式存储数据,而是直接存储数据的值;容器内部存储的各个元素的值都互不相等,且不能被修改。所以我们可以用set来统计数组中有多少个不同的数。

class Solution {
public:
    int minimumOperations(vector<int>& nums) {
         unordered_set<int>res;
         for(auto x : nums){
             if(x > 0) res.insert(x);
         }
         return res.size();
    }
};

T2:分组的最大数量
给你一个正整数数组 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 <= grades.length <= 105
1 <= grades[i] <= 105

这个题目我一开始想到的就是先对数组排序,然后在分组的时候就从头开始,保证下一组比上一组多一个,这样就不需要考虑成绩了。所以只需要简单的模拟一次,就可以得出最大分组的值。

class Solution {
public:
    int maximumGroups(vector<int>& grades) {
        sort(grades.begin(),grades.end());
        int res = 0;
        int  m = 0 , n = 0;
        m = 1 ;
        res = 1;
        for(int i = 1 ; i< grades.size() ; i++){
            ++n;
            if(n > m){
               ++res;
                m = n ;
                n = 0;
            }
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值