《LeetCode之每日一题》:144.找到需要补充粉笔的学生编号

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01 当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。 阅读详情

首先,今天是教师节
我祝愿天下的老师们,桃李芬芳,其乐融融!!!

找到需要补充粉笔的学生编号


题目链接: 找到需要补充粉笔的学生编号

有关题目

一个班级里有 n 个学生,编号为 0 到 n - 1 。
每个学生会依次回答问题,
编号为 0 的学生先回答,然后是编号为 1 的学生,以此类推,直到编号为 n - 1 的学生,
然后老师会重复这个过程,重新从编号为 0 的学生开始回答问题。

给你一个长度为 n 且下标从 0 开始的整数数组 chalk 和一个整数 k 。
一开始粉笔盒里总共有 k 支粉笔。
当编号为 i 的学生回答问题时,他会消耗 chalk[i] 支粉笔。
如果剩余粉笔数量 严格小于 chalk[i] ,那么学生 i 需要 补充 粉笔。

请你返回需要 补充 粉笔的学生 编号 。
示例 1:

输入:chalk = [5,1,5], k = 22
输出:0
解释:学生消耗粉笔情况如下:
- 编号为 0 的学生使用 5 支粉笔,然后 k = 17 。
- 编号为 1 的学生使用 1 支粉笔,然后 k = 16 。
- 编号为 2 的学生使用 5 支粉笔,然后 k = 11 。
- 编号为 0 的学生使用 5 支粉笔,然后 k = 6 。
- 编号为 1 的学生使用 1 支粉笔,然后 k = 5 。
- 编号为 2 的学生使用 5 支粉笔,然后 k = 0 。
编号为 0 的学生没有足够的粉笔,所以他需要补充粉笔。
示例 2:

输入:chalk = [3,4,1,2], k = 25
输出:1
解释:学生消耗粉笔情况如下:
- 编号为 0 的学生使用 3 支粉笔,然后 k = 22 。
- 编号为 1 的学生使用 4 支粉笔,然后 k = 18 。
- 编号为 2 的学生使用 1 支粉笔,然后 k = 17 。
- 编号为 3 的学生使用 2 支粉笔,然后 k = 15 。
- 编号为 0 的学生使用 3 支粉笔,然后 k = 12 。
- 编号为 1 的学生使用 4 支粉笔,然后 k = 8 。
- 编号为 2 的学生使用 1 支粉笔,然后 k = 7 。
- 编号为 3 的学生使用 2 支粉笔,然后 k = 5 。
- 编号为 0 的学生使用 3 支粉笔,然后 k = 2 。
编号为 1 的学生没有足够的粉笔,所以他需要补充粉笔。
提示:

chalk.length == n
1 <= n <= 10^5
1 <= chalk[i] <= 10^5
1 <= k <= 10^9

题解

思路:

法一:暴力法(超时)

class Solution {
public:
    int chalkReplacer(vector<int>& chalk, int k) {
        int n = chalk.size();
        while(true){
            for (int i = 0; i < n; ++i){
                if (chalk[i] > k){
                    return i;;
                }
                k -= chalk[i];
            }
        }
        return -1;
    }
};

题干范围得 -> 当 k 很大的时候,数组元素很小的时候,所需时间复杂度太大,会超时

法二:求和 + 模拟

class Solution {
public:
    int chalkReplacer(vector<int>& chalk, int k) {
        int n = chalk.size();

        //题干条件数组元素范围,为防止溢出,用long long
        long long sum = 0;
        for (auto& x : chalk){
            sum += x;
        }
        k %= sum;
        for (int i = 0; i < n; ++i){
            if (chalk[i] > k){
                return i;
            }
            k -= chalk[i];
        }
        return -1;
    }
};

时间复杂度:O(n),需两次遍历,每次O(n)复杂度,总时间复杂度O(n)

空间复杂度:O(1)

法三:前缀和 + 二分查找
参考官方题解

思路:
在模拟基础上,我们可以使用 前缀和 preFixSum[i] 数组,
来记录下标0 ~ i 的chalk中元素和,由于preFixSum 数组递增,
故我们可以使用二分查找 加速查找过程
细节:
我们可以在原数组的基础上,求解前缀和数组,此时可能出现溢出,
但同时我们注意到题干中所给的 k 最大为 10^9次方,如在溢出之前,前缀和数组的值超过 k 则,说明我们找到答案,
同时可以有效的避免溢出了,因为INT_MAX > 10^9,
class Solution {
public:
    int binarySearch(vector<int>& preFixSum, int k){
        int n = preFixSum.size();
        int l = 0, r = n;
        while(l < r){
            int mid = l + (r - l) / 2;
            if (preFixSum[mid] > k){
                r = mid;
            }
            else {
                l = mid + 1;
            }
        }
        return r;
    }
    int chalkReplacer(vector<int>& chalk, int k) {
        int n = chalk.size();
        if (chalk[0] > k){
            return 0;
        }

        for (int i = 1; i < n; ++i){
            chalk[i] += chalk[i - 1];
            if (chalk[i] > k){
                return i;
            }
        }

        k %= chalk.back();
        return binarySearch(chalk, k);
    }
};

时间复杂度:O(n),一次遍历,复杂度O(n)。一次二分查找,复杂度O(log n),总时间复杂度O(n)

空间复杂度:O(1)

有关使用STL的解
参考官方题解评论区梦璃夜·天星
法一:累加遍历
Tips

find_if() 用于搜寻使条件成立的第一个元素
mutable 中文"可变的, 易变的",可在const的函数里面修改一些跟类状态无关的数据成员

mutable用法

class Solution {
public:
    int chalkReplacer(vector<int>& chalk, int k) {
        return find_if(chalk.begin(), chalk.end(), [q = k % accumulate(chalk.begin(), chalk.end(), int64_t())](auto x)mutable{ return (q -= x) < 0;}) - chalk.begin();
    }
};

时间复杂度:O(n)
空间复杂度:O(1)

法二:前缀和 + 二分查找

class Solution {
public:
    int chalkReplacer(vector<int>& chalk, int k) {
        if (chalk[0] > k){
            return 0;
        }
        for (int i = 1; i < chalk.size(); ++i){
            chalk[i] += chalk[i - 1];
            if (chalk[i] > k)
                return i; 
        }
        return upper_bound(chalk.begin(), chalk.end(), k % chalk.back()) - chalk.begin();
    }
};

时间复杂度:O(n)
空间复杂度:O(1)

ESP32设备驱动-TM1637-驱动4位7段数码管 TM1637是一款带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成了MCU数字接口、数据锁存、LED高压驱动、键盘扫描等功能。 TM1637使用DIP20/SOP20封装,主要适用于电磁炉、微波炉、小家电的显示驱动。 阅读详情

相关推荐

【实用教程】使用AlphaFold2进行蛋白质结构在线预测

使用Colab进行简单快速的AlphaFold2在线的蛋白质三维结构预测

Eumenidus的博客 14万+

Leetcode——找到需要补充粉笔的学生编号

1. 找到需要补充粉笔的学生编号 (1)暴力 class Solution { public int chalkReplacer(int[] chalk, int k) { int len = chalk.length; for (int i = 0; i <= len; i++) { //到最后一个值,开启下一轮循环 if (i == len) { i = 0;

Yawn 224

MOSFET导通电阻Rdson全解析:物理组成、公式推导与工程选型要点

在功率电子设计中,MOSFET作为核心开关器件,其导通电阻Rdson直接决定导通损耗与系统效率。从半导体物理角度看,Rdson并非单一固定值,而是由源极电阻、沟道电阻、累积层电阻、JFET区电阻、漂移区电阻及衬底电阻等多个分量串联而成,并随栅极驱动电压、结温以及击穿电压等级发生显著变化。理解Rdson的物理来源与数学表达,有助于工程师在低压大电流与高压小电流等不同场景中合理选型、优化驱动电压并准确估算热损耗。文章从沟道电阻公式出发,深入剖析耐压与导通电阻的物理矛盾、温度系数的影响规律,并给出数据手册参数的正

weixin_29163857的博客 195

LeetCode 1894. 找到需要补充粉笔的学生编号--前缀和

找到需要补充粉笔的学生编号 一个班级里有 n 个学生,编号为 0 到 n - 1 。每个学生会依次回答问题,编号为 0 的学生先回答,然后是编号为 1 的学生,以此类推,直到编号为 n - 1 的学生,然后老师会重复这个过程,重新从编号为 0 的学生开始回答问题。 给你一个长度为 n 且下标从 0 开始的整数数组 chalk 和一个整数 k 。一开始粉笔盒里总共有 k 支粉笔。当编号为 i 的学生回答问题时,他会消耗 chalk[i] 支粉笔。如果剩余粉笔数量 严格小于 chalk[i] ,那么学生 i.

weixin_43918046的博客 315

【科研学习】Demo3D2015安装包以及图文安装步骤

安装包 点击下图的.exe文件,安装 不需要解压,打开注册机 如下图: 点击上图的.exe文件,出现下图 先点击 patch 打开安装目录下的Demo3D.licensing.dll文件,然后点击Generate,生成dvt-license文件,保存即可 打开安装完成的Demo3D 2015(64-bit),一般破解没完成的,会出现一个request a license 的问题,点击find license 的那一行 点击后找到自己Generate,生成dvt

KaelCui的博客 1万+

立创开源桌面激光雕刻机DIY全解析:从悬臂结构、Arduino主控到Marlin固件

本文详细解析了基于立创开源平台的桌面激光雕刻机DIY全过程。重点介绍了悬臂式机械结构的设计与优化,阐述了采用Arduino Mega 2560主控与RAMPS 1.4扩展板的经典控制方案,并深入讲解了Marlin固件的关键配置步骤,包括电机步数计算与激光功能启用,为创客和电子爱好者提供了一套完整的从硬件搭建到软件调试的实战指南。

weixin_42510201的博客 383

找到需要补充粉笔的学生编号

题目 解题思路 先计算出次遍历所消耗的粉笔数,然后取余 这样操作后,再次遍历即可得到结果 Code class Solution { public int chalkReplacer(int[] chalk, int k) { // n个学生,编号0-n - 1 // 回答顺序 0 - n -1 // 共k支粉笔,消耗chalk[i],当剩余量小于时,补充粉笔,返回需要补充的编号 int n = chalk.length;

沉心静气的博客 325

SAP-ABAP:SAP客户端管理核心事务码SCC4深度解析

SAP客户端管理核心事务码SCC4深度解析

baidu_35680696的博客 1568

力扣(LeetCode1894. 找到需要补充粉笔的学生编号(C语言)

前缀和+二分查找。

墨染 466

YOLOv8 架构改造实战:添加 P2 小目标检测头与 P6 超大目标检测头

上采样是指将特征图的空间尺寸变大(例如从 20×20 → 80×80),用来提升图像的分辨率。常见于解码器结构或特征融合中。下采样是指将特征图的空间尺寸缩小(例如从 256×256 → 128×128),通常用于减少计算量、提取更高级语义特征。操作目的方法尺寸变化上采样放大特征图插值算法变大(如2×)下采样压缩特征图、提取语义stride卷积等变小(如1/2)

FJN110的博客 575

【Claude】Extra inputs are not permitted 错误:代理剥离 Beta 标头的解决方案 bug报错已解决

深入分析Claude Code Extra inputs are not permitted 400错误的技术原理,解析代理剥离Beta标头的根因与多种修复方案。

一键难忘的博客 145

1894. 找到需要补充粉笔的学生编号(int溢出)

当kkk很大,远远超过chalkchalkchalk数组的和totaltotaltotal时,应该对totaltotaltotal取余,减少我们寻找的轮次。 取余后,k<totalk<totalk<total,我们只需遍历一次就能找出需要补充粉笔的学生编号。 其中,有一个问题就是,当数组中的数字很大时,其和totaltotaltotal可能会超出intintint范围。解决办法是用long longlong\ longlong long类型来保存求和结果。 int c.

jayloncheng的博客 274

深度学习-155-RAG技术之嵌入模型Embedding怎么选

Embedding技术在大型语言模型中发挥着至关重要的作用。它将文本转化为向量,使模型能够理解和处理复杂的语言信息。通过选择合适的Embedding方法和优化文本匹配策略,我们可以在搜索引擎、问答系统、推荐系统等领域实现高效且精准的文本匹配。

qq_20466211的博客 405

【每日一题Day144】LC1617统计子树中城市之间最大距离 | 树形dp

【每日一题Day144】LC1617统计子树中城市之间最大距离 | 树形dp

Tikitian的博客 208

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LeetCode 算法分类列表

💡 LeetCode 高频面试题分类列表,总共24类,312道题目!

Eliaukoyx 1247

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

力扣17题高效刷题法:算法面试突破指南

算法能力是程序员面试的核心竞争力,而力扣(LeetCode)作为算法训练的主流平台,其价值在于系统培养数据结构与算法的实战思维。理解递归、动态规划等算法范式的工作原理,掌握时间复杂度分析等基础方法,能显著提升代码效率。通过精心设计的17题训练计划,开发者可以快速建立算法知识体系,重点突破数组操作、链表处理、二叉树遍历等高频考点。这种聚焦核心题型的训练方式,配合模板化解题技巧,特别适合准备技术面试的工程师。在实际应用中,这种训练形成的算法直觉,能有效解决滑动窗口、回溯剪枝等工程常见问题。

weixin_33178839的博客 271

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

前端codetop手撕算法

核心思路:最优解是哈希表法,用 O (n) 时间复杂度解决,空间复杂度 O (n)(存储哈希表);关键逻辑:遍历过程中计算补数,查哈希表是否存在,存在则返回,不存在则存入;优势对比:哈希表法比暴力法效率提升百倍以上(尤其数组长度大时),符合进阶要求。46. 全排列方法时间复杂度空间复杂度特点迭代法O(n)O(1)空间更优,面试推荐递归法O(n)O(n)逻辑更简洁,但有递归栈开销核心逻辑迭代法:双指针遍历,逐个反转节点指向;递归法:先反转子链表,再调整当前节点指向。

2302_80168280的博客 573

Leetcode_找到需要补充粉笔的学生编号

Leetcode_找到需要补充粉笔的学生编号题目题解 题目 一个班级里有 n 个学生,编号为 0 到 n - 1 。每个学生会依次回答问题,编号为 0 的学生先回答,然后是编号为 1 的学生,以此类推,直到编号为 n - 1 的学生,然后老师会重复这个过程,重新从编号为 0 的学生开始回答问题。 给你一个长度为 n 且下标从 0 开始的整数数组 chalk 和一个整数 k 。一开始粉笔盒里总共有 k 支粉笔。当编号为 i 的学生回答问题时,他会消耗 chalk[i] 支粉笔。如果剩余粉笔数量 严格小于 ch

MicoChen_的博客 238

leetcode 5768. 找到需要补充粉笔的学生编号(C++)

一个班级里有n个学生,编号为0到n - 1。每个学生会依次回答问题,编号为0的学生先回答,然后是编号为1的学生,以此类推,直到编号为n - 1的学生,然后老师会重复这个过程,重新从编号为0的学生开始回答问题。 给你一个长度为n且下标从0开始的整数数组chalk和一个整数k。一开始粉笔盒里总共有k支粉笔。当编号为i的学生回答问题时,他会消耗chalk[i]支粉笔。如果剩余粉笔数量严格小于chalk[i],那么学生i需要补充粉笔。 请你返...

qq_27060423的博客 459

LeetCode2461~2480题目解析

LeetCode2461~2480题目解析

jiaomubai的博客 121

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

LeetCode 每日一题 2026/11/2-2026/11/8

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 176

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

huayimenghan的博客 208

Hash表:两数之和、字母异位词分组、最长连续序列 [力扣 Hot100]

三道高频哈希表应用题:两数之和(利用HashMap快速查找补数)、字母异位词分组(排序后作为键分组)、最长连续序列(通过HashSet去重并仅从序列起点扩展)。核心思想均为借助哈希结构优化查找效率,避免重复计算。同时提及双指针等其他解法思路,体现算法设计中“空间换时间”的典型策略。

2403_87560480的博客 219

力扣73 矩阵置零

该解法通过标记含0的行和列来实现矩阵置零。遍历矩阵,用布尔数组记录有0的行和列;再遍历一次,若当前行或列被标记,则置为0。时间复杂度O(mn),空间复杂度O(m+n)。

Pniubi的博客 23

LeetCode Hot 100 二叉树专题(三):BST 二叉搜索树与右视图(Java)

本专题主线:三题(98 / 230 / 199)共用两把钥匙——BST 的中序序列严格递增,以及遍历中的"层"与"深度"标记。看懂这两点,三题共用一套模板。 结构约定:每题统一分三部分——①题目分析与解题思路(含易错点辨析);②常见解法(附代码)及讲解;③知识点总结。

2401_88612756的博客 666
上一篇: 《LeetCode之每日一题》:143.IPO
下一篇: 《LeetCode之每日一题》:145.x 的平方根
Mascottttttt
博客等级 码龄6年 628粉丝 367原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值