【LeetCode:2860】让所有学生保持开心的分组方法数(Java)

题目链接

  • 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

求解思路

模拟

  • 对于每次的选人方案,应满足:选择人数为 i i i 时,所有 n u m s nums nums 值小于 i i i 的都被选中;所有 n u m s nums nums 值大于 i i i 的都没有被选中;并且不存在 n u m s nums nums 值等于 i i i
  • 再进行比较时我们只关心组内值的大小,与数组元素位置无关,因此可以对数组进行排序,方便找到最值。
  • 将排序后的数组从头开始遍历,如果前 i i i 个元素的最大值小于 i i i,并且后 n − i n-i ni 个元素的最小值大于 i i i,则选取出 i i i 个人的方案可行。

实现代码

class Solution {
    public int countWays(List<Integer> nums) {
        int ans = 0;
        int n = nums.size();
        Collections.sort(nums);
        for (int i = 0; i <= n; i ++) {
            if (i > 0 && nums.get(i - 1) >= i) {
                continue;
            }
            if (i < n && nums.get(i) <= i) {
                continue;
            }
            ans ++;
        }
        return ans;
    }
}

你可能感兴趣的:(算法刷题,leetcode,java,算法)