2860 让所有学生保持开心的分组方法数
题目描述
给你一个下标从0
开始、长度为n
的整数数组 nums
,其中 n
是班级中学生的总数。班主任希望能够在让所有学生保持开心的情况下选出一组学生:
如果能够满足下述两个条件之一,则认为第 i
位学生将会保持开心:
这位学生被选中,并且被选中的学生人数 严格大于 nums[i]
。
这位学生没有被选中,并且被选中的学生人数 严格小于 nums[i]
。
返回能够满足让所有学生保持开心的分组方法的数目。
题目解析
我们观察到,要让学生开心需要满足两个条件
- 这位学生被选中,并且被选中的学生人数 严格大于
nums[i]
。 - 这位学生没有被选中,并且被选中的学生人数 严格小于
nums[i]
。
这两个条件均和一个变量,即被选中的学生人数有关。
因此我们可以设置一个变量 count
,表示被选中的学生人数,count
的取值为0到n。
上述两个条件可以转换为:
nums
中存在 count
个元素,严格小于 count
。
剩余的nums-count
个元素,严格大于 count
。
因此我们可以将nums
数组进行排序。检查数组nums
中是否存在 count
个小于 count
的元素。
算法分析:
- 时间复杂度O(n*log(n))。
- 空间复杂度O(1)。没有引入额外的空间。
代码实现
Go版本:
func countWays(nums []int) int {
var res int
n:=len(nums)
sort.Ints(nums)
for i:=0;i<=n;i++{
if i>0&&nums[i-1]>=i{
continue
}
if i<n&&nums[i]<=i{
continue
}
res++
}
return res
}
C++版本:
class Solution {
public:
int countWays(vector<int>& nums) {
int n=nums.size();
int res=0;
sort(nums.begin(), nums.end());
for(int i=0;i<=n;i++){
if(i>0&&nums[i-1]>=i){
continue;
}
if(i<n&&nums[i]<=i){
continue;
}
res++;
}
return res;
}
};
Python版本:
class Solution(object):
def countWays(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n=len(nums)
nums.sort()
res=0
for i in range(n+1):
if i>0 and nums[i-1]>=i:
continue
if i<n and nums[i]<=i:
continue
res+=1
return res