2860.让所有学生保持开心的分组方法数
【LetMeFly】2860.让所有学生保持开心的分组方法数:排序+遍历
力扣题目链接:https://leetcode.cn/problems/happy-students/
给你一个下标从 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
解题方法:排序遍历
要选一个学生,那肯定是尽可能选值比较小的学生:
因为选中的学生要求“选中数”大于自己的值,选中的学生值越小越容易满足;
还因为未选中的学生要求“选中数”小于自己的值,未选中的学生值越大越容易满足。
所以按学生的值从小到大排个序,然后就能开始愉快地遍历学生了:
使用$i$从$1$到$n-1$遍历,代表选中前$i$个学生。
如果$i\gt nums[i - 1]$,则说明选中数大于选中学生的值;如果$i\lt nums[i]$,则说明选中数小于未选中学生的值。
如果二者同时满足,则可行方案数加一。
注意,上述遍历过程中未考虑全选或全不选的情况:
如果所有学生的值都大于$0$,则可以全不选;
因为没有学生的值大于等于学生个数,因此一定可以全选。
- 时间复杂度$O(n\log n)$,其中$n=len(nums)$
- 空间复杂度$O(\log n)$
AC代码
C++
1 |
|
Python
1 |
|
Go
1 |
|
Java
1 |
|
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/141905408
2860.让所有学生保持开心的分组方法数
https://blog.letmefly.xyz/2024/09/04/LeetCode 2860.让所有学生保持开心的分组方法数/