本文主要是介绍数学题--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;
这篇关于数学题--2860. 让所有学生保持开心的分组方法数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!