100040. 让所有学生保持开心的分组方法数
给你一个下标从 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 的学生形成一组。
班主任选中所有学生形成一组。
提示:
解题思路
- 排序
- 遍历选择0,1,2,....n是否可行
- 尽可能选择小的
为什么能够想到呢?一个是看数据范围:O(n)或者O(nlogn),另外一个就是在想怎么选择的时候:
- 没有选中,那么选中的数目要严格小于nums[i] -> 没选中的nums[i]要尽可能大
- 选中,那么选中的数目要严格大于nums[i] -> 选中的nums[i]要尽可能小
code
class Solution {
public:
//没有被选中,选中人数严格小于nums[i]
//被选中,选中人数严格大于nums[i]
//让所有学生都开心的分组数目
//10 ^ 5
//O(n) or O(nlogn)
//排序
//遍历
//选中人数k
//
int countWays(vector<int>& nums) {
sort(nums.begin(),nums.end());
int ans = 0,k = 0;
if(k < nums[0]) ans ++;
int i;
for(i = 0;i < nums.size() - 1;i ++)
{
k ++ ;
if(k < nums[i + 1] && k > nums[i]) ans ++;
}
k ++;
if(k > nums[i]) ans ++;
return ans;
}
};
分类:
leetcode周赛
标签:
排序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理