您的位置:首页 > 科技 > IT业 > LeetCode 2860.让所有学生保持开心的分组方法数:排序+遍历

LeetCode 2860.让所有学生保持开心的分组方法数:排序+遍历

2024/12/26 11:28:56 来源:https://blog.csdn.net/Tisfy/article/details/141905408  浏览:    关键词:LeetCode 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 i i 1 1 1 n − 1 n-1 n1遍历,代表选中前 i i i个学生。

如果 i > n u m s [ i − 1 ] i\gt nums[i - 1] i>nums[i1],则说明选中数大于选中学生的值;如果 i < n u m s [ i ] i\lt nums[i] i<nums[i],则说明选中数小于未选中学生的值。

如果二者同时满足,则可行方案数加一。

注意,上述遍历过程中未考虑全选或全不选的情况:

如果所有学生的值都大于 0 0 0,则可以全不选;

因为没有学生的值大于等于学生个数,因此一定可以全选。

  • 时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),其中 n = l e n ( n u m s ) n=len(nums) n=len(nums)
  • 空间复杂度 O ( log ⁡ n ) O(\log n) O(logn)

AC代码

C++
class Solution {
public:int countWays(vector<int>& nums) {sort(nums.begin(), nums.end());int ans = 1 + (*min_element(nums.begin(), nums.end()) > 0);for (int i = 1; i < nums.size(); i++) {ans += i > nums[i - 1] && i < nums[i];}return ans;}
};
Python
from typing import Listclass Solution:def countWays(self, nums: List[int]) -> int:nums.sort()ans = 1 + (nums[0] != 0)for i in range(1, len(nums)):ans += i > nums[i - 1] and i < nums[i]return ans
Go
package main
import "sort"func countWays(nums []int) int {sort.Ints(nums)ans := 1if nums[0] > 0 {ans++}for i := 1; i < len(nums); i++ {if i > nums[i - 1] && i < nums[i] {ans++}}return ans
}
Java
import java.util.List;
import java.util.Collections;class Solution {public int countWays(List<Integer> nums) {Collections.sort(nums);int ans = 1 + (nums.get(0) > 0 ? 1 : 0);for (int i = 1; i < nums.size(); i++) {ans += i > nums.get(i - 1) && i < nums.get(i) ? 1 : 0;}return ans;}
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/141905408

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com