关键词:
文章目录
1. 题目来源
2. 题目解析
有个坑点,有点恶心。首先被数据坑一把,需要开 LL,然后被边界坑一把…
先求前缀和,然后 k
对 a[n-1]
取模,然后二分出小于等于 k
的最大值即可。注意,然后就被坑了。 因为小于等于 k
意味着当前同学可以用完粉笔,下一个同学不能用完粉笔,然后就需要返回 l+1
。然而在 k
在对 a[n-1]
取模的时候,以及初始情况都可能导致 k<a[0]
,此时当然应该返回 a[0]
,然而直接返回 a[l+1]
等价于返回 a[1]
肯定是错误的。
所以,二分完之后,a[l]
并不一定是小于等于 k
的,也就是 l+1
这个人并不一定是最终答案,l
也可能是答案。
当然,得到总和,取模之后完全不必要二分。直接遍历一遍,到哪个人粉笔不够了,当然就要输出那个人的编号了。这样就不需要额外开空间了。
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
class Solution
public:
int chalkReplacer(vector<int>& chalk, int k)
using LL = long long;
int n = chalk.size();
vector<LL> a;
for (auto e : chalk) a.push_back(e);
for (int i = 1; i < n; i ++ ) a[i] += a[i - 1];
k %= a[n - 1];
int l = 0, r = n - 1;
while (l < r) // 二分小于等于 k 的最大的一个位置
int mid = l + r + 1 >> 1;
if (a[mid] > k) r = mid - 1;
else l = mid;
// 如果小于等于 k,那么是下一个同学铅笔不够,即返回l+1,否则就是本同学铅笔不够
// 值得注意的是,二分停下来的位置按理说一定是 a[l]<=k 的
// 下面这个三目运算符怎么会取到 a[l]>k 的情况呢?
// 实际上因为有 k%=a[n - 1]这个操作,可能会导致 a[0]>k,导致需要返回 0 下标,
// 所有的 a[mid]>k,导致右边界一直缩小到 l,此时 l=r=0
// 所以唯一的情况就是当第一个 a[0]>k 时,二分才会停在 0 的位置,返回l=r=0即可,
// 其它情况都是 a[l]<=k,需要返回 l+1 或者 r+1
// if (a[0] > k) return 0;
// return a[l] <= k ? l + 1 : l - 1000; 后面的不会被执行到
return a[l] <= k ? l + 1 : l;
;
go 代码
func chalkReplacer(chalk []int, k int) int
n := len(chalk)
sum := 0
for i := 0; i < n; i ++
sum += chalk[i]
k %= sum
for i := 0; i < n; i ++
if chalk[i] > k
return i
k -= chalk[i]
return -1
1894.找到需要补充粉笔的学生编号(代码片段)
一个班级里有 n 个学生,编号为0 到n-1 。每个学生会依次回答问题,编号为0 的学生先回答,然后是编号为1 的学生,以此类推,直到编号为n-1 的学生,然后老师会重复这个过程,重新从编号为0 ... 查看详情
1894.找到需要补充粉笔的学生编号(代码片段)
一个班级里有 n 个学生,编号为0 到n-1 。每个学生会依次回答问题,编号为0 的学生先回答,然后是编号为1 的学生,以此类推,直到编号为n-1 的学生,然后老师会重复这个过程,重新从编号为0 ... 查看详情
力扣每日一题1894.找到需要补充粉笔的学生编号(代码片段)
题目一个班级里有n个学生,编号为0到n-1。每个学生会依次回答问题,编号为0的学生先回答,然后是编号为1的学生,以此类推,直到编号为n-1的学生,然后老师会重复这个过程,重新从编号为0的学生... 查看详情
leetcode刷题100天—1894.找到需要补充粉笔的学生编号(数组)—day34(代码片段)
...xff1a;作者:神的孩子在歌唱大家好,我叫运智1894.找到需要补充粉笔的学生编号难度中等39收藏分享切换为英文接收动态反馈一个班级里有n个学生,编号为0到n-1。每个学生会依次回答问题,编号为0的学生先回答... 查看详情
leetcode刷题100天—1894.找到需要补充粉笔的学生编号(数组)—day34(代码片段)
...xff1a;作者:神的孩子在歌唱大家好,我叫运智1894.找到需要补充粉笔的学生编号难度中等39收藏分享切换为英文接收动态反馈一个班级里有n个学生,编号为0到n-1。每个学生会依次回答问题,编号为0的学生先回答... 查看详情
leetcode刷题1894-中等-找到需要补充粉笔的学生编号(代码片段)
文章目录☀️前言☀️🙀作者简介🙀💗一、题目描述💗💁二、题目解析💁🏃三、代码🏃☁️1️⃣.python☁️❄️2️⃣.C#❄️🌔结语🌔☀️前言☀️算法作为极其重要的一点,是大... 查看详情
leetcode刷题1894-中等-找到需要补充粉笔的学生编号(代码片段)
文章目录☀️前言☀️🙀作者简介🙀💗一、题目描述💗💁二、题目解析💁🏃三、代码🏃☁️1️⃣.python☁️❄️2️⃣.C#❄️🌔结语🌔☀️前言☀️算法作为极其重要的一点,是大... 查看详情
leetcode1894找到需要补充粉笔的学生编号[取余]heroding的leetcode之路(代码片段)
...;这样可以省去许多不必要的循环操作,这个时候直接找到哪一位粉笔刚好用完且不够& 查看详情
leetcode68.文本左右对齐/1894.找到需要补充粉笔的学生编号/600.不含连续1的非负整数(数位dp,好好学)(代码片段)
68.文本左右对齐2021.9.9每日一题题目描述给定一个单词数组和一个长度maxWidth,重新排版单词,使其成为每行恰好有maxWidth个字符,且左右两端对齐的文本。你应该使用“贪心算法”来放置给定的单词;也就是说... 查看详情
leetcode教师节特典--找到需要补充粉笔的学生编号(代码片段)
...:acking-you.github.io题目OJ平台题目解析实际上就是一个前缀和+二分的处理,我一旦爆出前缀和+二分,应该就都有思路了!解题代码这里偷懒使用了STL,当然也可自己去写二分。classSolutionpublic:usingll=long... 查看详情
leetcode——找到需要补充粉笔的学生编号(代码片段)
1.找到需要补充粉笔的学生编号(1)暴力(直接模拟)classSolutionpublicintchalkReplacer(int[]chalk,intk)intlen=chalk.length;for(inti=0;i<=len;i++)//到最后一个值,开启下一轮循环if( 查看详情
《leetcode之每日一题》:144.找到需要补充粉笔的学生编号(代码片段)
...老师们,桃李芬芳,其乐融融!!!找到需要补充粉笔的学生编号有关题目题解题目链接:找到需要补充粉笔的学生编号有关题目一个班级里有n个学生,编号为0到n-1。每个学生会依次回答问题,编... 查看详情
✨code皮皮虾一次通过99.90%,思路详解找到需要补充粉笔的学生编号(代码片段)
文章目录😉毛遂自荐✨题目🔥解题思路🌈代码实现💖最后Code皮皮虾一个沙雕而又有趣的憨憨少年,和大多数小伙伴们一样喜欢听歌、游戏,当然除此之外还有写作的兴趣,emm…,日子还很长... 查看详情
[m前缀和]lc930.和相同的二元子数组(滑动窗口+双指针+哈希优化)(代码片段)
...1.题目来源链接:930.和相同的二元子数组相同:[M前缀和]lc560.和为K的子数组(经典好题+哈希优化)进阶:[H前缀和]lc1074.元素和为目标值的子矩阵数量(前缀和+哈希优化+知识理解)相关题目:【动画模拟】秒... 查看详情
[m前缀和]lc1014.最佳观光组合(思维+前缀和+算法优化)(代码片段)
文章目录1.题目来源2.题目解析1.题目来源链接:1014.最佳观光组合进阶题:[Mdp]lc1937.扣分后的最大得分(dp优化+前后缀优化+周赛250_3)2.题目解析思维题,算法优化,两次遍历妥妥超时,也没啥二段性可言... 查看详情
[m前缀和]lc560.和为k的子数组(经典好题+哈希优化)(代码片段)
...指针,所有元素非负,具备单调性。进阶:[H前缀和]lc1074.元素和为目标值的子矩阵数量(前缀和+哈希优化+知识理解)相关题目:【动画模拟】秒杀七道题题解区总是有大佬来归类相似的题%% 查看详情
[m前缀和]lc1139.最大的以1为边界的正方形(行列前缀和+代码技巧)(代码片段)
...的正方形2.题目解析1744分的题目,实际上采用行、列前缀和,加上一个小性质就能快速解决了。官解写的太长了。如果[l,r]均为1的话,则前缀和s[r]-s[l-1]=r-l+1前缀和值等于区间长度值。若是正方形,则枚举左... 查看详情
[m数学]lc528.按权重随机选择(前缀和+数学+概率+几何概型+好题)(代码片段)
文章目录1.题目来源2.题目解析1.题目来源链接:528.按权重随机选择2.题目解析一般来讲,产生随机数本身就是一个不可靠的事情。但是本题对于工程上而言,也是有一定实际意义的。例如,负载均衡,算力各... 查看详情