当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 分享——有趣的题目
  • 一文教你学会java代码审计
  • 网络编程学习:TCP/IP协议
  • 数据库系统 第35节 数据库加密
  • HarmonyOS开发实战( Beta5版)Swiper高性能开发指南
  • 传统CV算法——图像基本操作与形态学操作
  • 【机器学习】.fit_transform()跟.transform()的区别
  • PDF文本指令解析与文本水印去除
  • Qt 字符串的编码方式,以及反斜杠加3个数字是什么编码\344\275\240,如何生成
  • TCP协议多进程多线程并发服务器
  • glsl着色器学习(六)
  • 第 20 章 DOM 进阶
  • ET6框架(五)ECS组件式编程
  • C语言之结构体
  • JS设计模式之“名片设计师” - 工厂方法模式
  • 「译」Node.js Streams 基础
  • 【EOS】Cleos基础
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Angularjs之国际化
  • Js基础知识(一) - 变量
  • Python学习之路16-使用API
  • V4L2视频输入框架概述
  • vuex 学习笔记 01
  • 实战|智能家居行业移动应用性能分析
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • #php的pecl工具#
  • (09)Hive——CTE 公共表达式
  • (ibm)Java 语言的 XPath API
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)软件性能测试
  • (算法)硬币问题
  • (学习日记)2024.02.29:UCOSIII第二节
  • (循环依赖问题)学习spring的第九天
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • *1 计算机基础和操作系统基础及几大协议
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .NET C# 操作Neo4j图数据库
  • .Net core 6.0 升8.0
  • .net 按比例显示图片的缩略图
  • .NET 药厂业务系统 CPU爆高分析
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .Net多线程Threading相关详解
  • .net连接oracle数据库
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • /var/lib/dpkg/lock 锁定问题
  • @ConditionalOnProperty注解使用说明
  • @vueup/vue-quill使用quill-better-table报moduleClass is not a constructor