IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode: 1894.找到需要补充粉笔的学生编号 -> 正文阅读

[数据结构与算法]leetcode: 1894.找到需要补充粉笔的学生编号

题目

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-student-that-will-replace-the-chalk

一个班级里有 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 <= 105
1 <= chalk[i] <= 105
1 <= k <= 109

解法

贪心算法模拟或者前缀和+二分查找法

  • 贪心算法模拟这一个过程,发现chalk列表的和是多少,反复的在k范围内进行循环,直到k的值小于需求的时候返回下标
  • 通过前缀和,来变成一个升序序列,然后通过取余之后二分查找法,找到那个最新大于k的值的那个点
class Solution:
    def chalkReplacer(self, chalk: List[int], k: int) -> int:
        # 解法一
        n = len(chalk)
        """
        total_sum = sum(chalk)
        k = k % total_sum
        for i in range(n):
            curr_res = chalk[i]
            if chalk[i] <= k:
                k -= chalk[i]
            else:
                return i
        """
        
        # 解法二 前缀和+二分法
        if chalk[0] > k:
            return 0
        for i in range(1, n):
            chalk[i] = chalk[i] + chalk[i-1]
            if chalk[i] > k:
                return i
        
        k %= chalk[-1]
        return bisect_right(chalk, k)
    
    def bisect_right(self, chalk: List[int], k: int) -> int:
        left = 0
        right = len(chalk)
        mid = left + (right-left) // 2
        while left <= right:
            if chalk[mid] > k:
                right = mid
            else:
                left = mid + 1
        return right
       
  • c++
class Solution {
public:
    int chalkReplacer(vector<int>& chalk, int k) {
        int n = chalk.size();
        /*
        long long total = accumulate(chalk.begin(), chalk.end(), 0LL);
        k %= total;
        int res = -1;
        for(int i=0; i< n; i++)
        {
            if(chalk[i] <= k)
            {
                k -= chalk[i];
            }
            else
            {
                res = i;
                break;
            }
        }
        return res;
        */

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

        // k %= chalk.back();
        k %= chalk[n-1];
        //return upper_bound(chalk.begin(), chalk.end(), k) - chalk.begin();
        int left = 0;
        int right = n;
        while(left < right)
        {
            int mid = left + (right-left) /2;
            if(chalk[mid] > k)
            {
                right = mid;
            }
            else
            {
                left = mid + 1;
            }
        }
        return right;
    }
};

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组chalk中所有的长度
  • 空间复杂度:O(1)
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 19:04:09  更:2021-09-11 19:04:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:47:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码