leetcode :2860让所有学生保持开心的分组方法数 排序

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值