算法学习每日一题之

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

思路

观察题目我们不难发现在升序排序后存在以下的特点:

  1. 由于nums[i] < n 所以首先全选是可以的
  2. 相同的元素要么都选要么都不选,试想一下nums[i-1]和nums[i]相等,此时选了nums[i-1]就意味着学生人数要严格大于nums[i-1],而nums[i]没有选,又要求学生人数严格大于nums[i],就产生了矛盾
  3. 选了nums[i] i之前的都要选,证明和第二点类似
  4. 全不选就要判断下数组中是否有元素小于0,小于0不满足

Code

class Solution {
public:
    int countWays(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int n = nums.size();
        int ans = nums[0] > 0;//一个学生不选的情况,此时若是数组中有元素小于0就不满足
        for(int i = 1; i < n; i++)
        {
            //nums[i - 1]选而不选nums[i],所以需要满足nums[i - 1] < i < nums[i],
            ans += nums[i - 1] < i && i < nums[i];
        }
        return ans + 1;//全选的情况
        
    }
};
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值