[m前缀和]lc1894.找到需要补充粉笔的学生编号(二分+模拟+坑点)(代码片段)

Ypuyu Ypuyu     2022-11-29     578

关键词:

文章目录

1. 题目来源

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

2. 题目解析

有个坑点,有点恶心。首先被数据坑一把,需要开 LL,然后被边界坑一把…

先求前缀和,然后 ka[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的学生先回答&#x... 查看详情

leetcode刷题100天—1894.找到需要补充粉笔的学生编号(数组)—day34(代码片段)

...xff1a;作者:神的孩子在歌唱大家好,我叫运智1894.找到需要补充粉笔的学生编号难度中等39收藏分享切换为英文接收动态反馈一个班级里有n个学生,编号为0到n-1。每个学生会依次回答问题,编号为0的学生先回答&#x... 查看详情

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.题目解析思维题,算法优化,两次遍历妥妥超时,也没啥二段性可言&#x... 查看详情

[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.题目解析一般来讲,产生随机数本身就是一个不可靠的事情。但是本题对于工程上而言,也是有一定实际意义的。例如,负载均衡,算力各... 查看详情