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 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 1894. 找到需要补充粉笔的学生编号 -> 正文阅读

[C++知识库]1894. 找到需要补充粉笔的学生编号

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

贴个题目:

题目

贴个示例:

示例

解题思路:

方法一:一次遍历+模拟

读完题目我们可以看出,其实就是循环派粉笔给学生,直到学生拿不到足够的粉笔,这时候就返回学生的位置。

那么我们可以先求循环一次学生需要多少支粉笔,然后求出派到最后一轮的时候,剩余的粉笔数。

最后就遍历一次数组,一边遍历,一边减少粉笔数,什么时候粉笔数是负数的时候,就证明这一个学生不够粉笔派了,此时返回这一个学生的下标即可。

优化:

我们可以通过取余数来求出最后一轮的时候剩余的粉笔数,这样子也能避免数据溢出

accumulate()函数是C++中的求和函数,详情可以看介绍:C++STL中的求和函数accumulate()

方法一代码:

class Solution {
public:
    int chalkReplacer(vector<int>& chalk, int k) {
        //accumulate(_InIt _First, _InIt _Last, _Ty _Val)求和函数
        //因为sum是long long类型,因此最后一个参数是0LL而不是0
        long long sum=accumulate(chalk.begin(),chalk.end(),0LL);
        //求出最后一轮剩余的粉笔数量
        int reminder=k%sum;
        int index=-1;
        //求出不够派的学生位置
        while(reminder>=0) reminder-=chalk[++index];
        return index;
    }
};

方法一性能分析:

时间分析:

一次遍历数组,因此时间复杂度是:O(n)

空间分析:

新建了常数个变量,因此空间复杂度是:O(1)

方法二:前缀和+二分查找

仔细阅读题目之后我们可以发现,其实求在最后一次派粉笔的时候,要求派的前n个同学的粉笔数大于k,此时就返回n这个校标即可。

那么根据以上的思路,我们可以使用前缀和求出前n个同学的粉笔数,然后在查找k的位置的时候,由于前缀和数组是递增数组,因此可以使用二分查找算法。

upper_bound()是C++中的二分查找函数,详细可以查看以下链接:C++STL中的upper_bound()函数的使用

方法二代码:

class Solution {
public:
    int chalkReplacer(vector<int>& chalk, int k) {
        if(chalk.front()>k) return 0;//特殊情况
        //前缀和
        for(int i=1;i<chalk.size();i++)
        {
            chalk[i]+=chalk[i-1];
            if(chalk[i]>k) return i;
        }
        k%=chalk.back();//取余数,减少k的大小
        //二分查找函数upper_bound,寻找大于k的数
        return upper_bound(chalk.begin(),chalk.end(),k)-chalk.begin();
    }
};

方法二性能分析:

时间分析:

前缀和时间复杂度是:O(n),二分查找的时间复杂度是:O(logn),因此总的时间复杂度是取其最大值,为:O(n)

空间分析:

新建了常数个变量,因此空间复杂度是:O(1)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 18:37:21  更:2021-09-11 18:38:07 
 
开发: 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/23 20:39:59-

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