列表

详情


100040. 让所有学生保持开心的分组方法数

给你一个下标从 0 开始、长度为 n 的整数数组 nums ,其中 n 是班级中学生的总数。班主任希望能够在让所有学生保持开心的情况下选出一组学生:

如果能够满足下述两个条件之一,则认为第 i 位学生将会保持开心:

返回能够满足让所有学生保持开心的分组方法的数目。

 

示例 1:

输入:nums = [1,1]
输出:2
解释:
有两种可行的方法:
班主任没有选中学生。
班主任选中所有学生形成一组。 
如果班主任仅选中一个学生来完成分组,那么两个学生都无法保持开心。因此,仅存在两种可行的方法。

示例 2:

输入:nums = [6,0,3,3,6,7,2,7]
输出:3
解释:
存在三种可行的方法:
班主任选中下标为 1 的学生形成一组。
班主任选中下标为 1、2、3、6 的学生形成一组。
班主任选中所有学生形成一组。 

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int countWays(vector<int>& nums) { } };

python3 解法, 执行用时: 120 ms, 内存消耗: 25.4 MB, 提交时间: 2023-09-17 22:35:37

class Solution:
    def countWays(self, nums: List[int]) -> int:
        nums.sort()
        n = len(nums)
        ans = nums[0] > 0
        for i, (x, y) in enumerate(pairwise(nums)):
            if x < i + 1 < y:
                ans += 1
        return ans + 1

java 解法, 执行用时: 21 ms, 内存消耗: 55 MB, 提交时间: 2023-09-17 22:35:21

class Solution {
    public int countWays(List<Integer> nums) {
        int[] a = nums.stream().mapToInt(i -> i).toArray();
        Arrays.sort(a);
        int n = a.length;
        int ans = a[0] > 0 ? 1 : 0;
        for (int i = 0; i < n - 1; i++) {
            if (a[i] < i + 1 && i + 1 < a[i + 1]) {
                ans++;
            }
        }
        return ans + 1;
    }
}

cpp 解法, 执行用时: 96 ms, 内存消耗: 70.6 MB, 提交时间: 2023-09-17 22:35:11

class Solution {
public:
    int countWays(vector<int> &nums) {
        sort(nums.begin(), nums.end());
        int n = nums.size();
        int ans = nums[0] > 0;
        for (int i = 0; i < n - 1; i++) {
            if (nums[i] < i + 1 && i + 1 < nums[i + 1]) {
                ans++;
            }
        }
        return ans + 1;
    }
};

golang 解法, 执行用时: 100 ms, 内存消耗: 7.8 MB, 提交时间: 2023-09-17 22:34:56

func countWays(nums []int) (ans int) {
	sort.Ints(nums)
	if nums[0] > 0 {
		ans++
	}
	for i, x := range nums {
		if x < i+1 && (i == len(nums)-1 || i+1 < nums[i+1]) {
			ans++
		}
	}
	return
}

javascript 解法, 执行用时: 144 ms, 内存消耗: 51.7 MB, 提交时间: 2023-09-17 22:34:43

/**
 * @param {number[]} nums
 * @return {number}
 */
var countWays = function (nums) {
    nums.sort((a, b) => a - b);
    const n = nums.length;
    let ans = nums[0] > 0 ? 1 : 0;
    for (let i = 0; i < n - 1; i++) {
        if (nums[i] < i + 1 && i + 1 < nums[i + 1]) {
            ans++;
        }
    }
    return ans + 1;
};

上一题