数学题--2860. 让所有学生保持开心的分组方法数

2860. 让所有学生保持开心的分组方法数

给你一个下标从 0 开始、长度为 n 的整数数组 nums ,其中 n 是班级中学生的总数。班主任希望能够在让所有学生保持开心的情况下选出一组学生:

如果能够满足下述两个条件之一,则认为第 i 位学生将会保持开心:

  • 这位学生被选中,并且被选中的学生人数 严格大于 nums[i] 。
  • 这位学生没有被选中,并且被选中的学生人数 严格小于 nums[i] 。

返回能够满足让所有学生保持开心的分组方法的数目。

示例 1:

输入:nums = [1,1]
输出:2
解释:
有两种可行的方法:
班主任没有选中学生。
班主任选中所有学生形成一组。 
如果班主任仅选中一个学生来完成分组,那么两个学生都无法保持开心。因此,仅存在两种可行的方法。

示例 2:

输入:nums = [6,0,3,3,6,7,2,7]
输出:3
解释:
存在三种可行的方法:
班主任选中下标为 1 的学生形成一组。
班主任选中下标为 1、2、3、6 的学生形成一组。
班主任选中所有学生形成一组。 

提示:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] < nums.length

先排序
情况一:都不选 看 第一个数是不是大于 0 大于0
情况二:都选 看最后一个数是不是小于n 小于n
情况三:从小到大遍历 cnt为被选人数
              遍历到的人数就为备选的人数 它们的nums值要小于cnt
              没遍历到的人数接位没选的人数 它们的nums值要大于cnt
              所以从前往后遍历
              判断当前的值是否小于cnt 后一个值是否大于cnt 满足就是一组结果

class Solution {
public:
    int countWays(vector<int>& nums) {
        int n = nums.size();
        ranges::sort(nums);
        //sort(nums.begin(), nums.end()); //从小到大排序
        int ans = 0;


        //判断都不选
        if (nums[0] > 0) ans++;
        //判断都选
        if (nums[n - 1] < n) ans++;

        for (int i = 1; i < n - 1; i++) {
            //nums[i]代表没选的最小值,nums[i - 1]代表已选的最大值
            //已选的人数就是i的值
            if (nums[i] > i && nums[i - 1] < i) {
                ans++;
            }
        }
        return ans;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值