力扣(LeetCode)1760. 袋子里最少数目的球(C++/C)

news2025/2/1 7:59:23

二分查找

直观思维是对每个袋子进行分球操作,这样枚举似乎无从下手。逆向思维,从 1 1 1 开始,枚举袋子里球的最大数量,可以计算划分每个袋子需要的最小次数,通过最小次数之和,判断方案是否可行。由于从小到大枚举,第一个可行的方案就是所求。枚举时间复杂度 O ( m ) O(m) O(m) m m m 是初始状态所有袋子里的最大球数,最多枚举到 m m m ,再往上枚举就没有意义了。二分查找可以优化枚举,时间复杂度 O ( l o g m ) O(logm) O(logm)

对于每个枚举(查找),需要计算划分次数之和,计算每个袋子的划分次数,需要遍历整个数组,时间复杂度 O ( n ) O(n) O(n) n n n 是数组大小。枚举(查找)和遍历数组是乘积关系,总时间复杂度 O ( n l o g m ) O(nlogm) O(nlogm)

提示 : 利用公式(上取整) 计算每个袋子的划分次数。 上取整公式 = ⌈ x m i d − 1 ⌉ = ⌊ x + m i d − 1 m i d − 1 ⌋ = ⌊ x − 1 m i d ⌋ =\lceil\frac{x}{mid}-1\rceil=\lfloor\frac{x+mid-1}{mid}-1\rfloor=\lfloor\frac{x-1}{mid}\rfloor =midx1=midx+mid11=midx1
上取整的含义 : 小球总数为 x x x 的袋子,划分成若干 小球总数为 m i d mid mid 的袋子,需要的最小次数。

上取整转化下取整公式有严格证明,建议读者背住。

CPP

class Solution {
public:
    int minimumSize(vector<int>& nums, int maxOperations) {
        int l = 1, r= *max_element(nums.begin(),nums.end());
        while(l<=r){
            int mid = l + (r-l>>1);
            int sum = 0;
            for(auto &x:nums) sum += (x-1)/mid;
            if(sum>maxOperations) l = mid + 1;
            else r = mid - 1;
        }return l;
    }
};

C

int minimumSize(int* nums, int numsSize, int maxOperations){
    int left = 1,right = 0,mid = 0;
    for(int i = 0;i<numsSize;i++){
        if(right<nums[i]){//找到所有桶中最大值
            right = nums[i];//最大值作为右边界
        }
    }
    while(left<=right){
        mid = left + ((right - left)>>1);//以mid为桶的最大值划分
        long long opt = 0;//需要的拆分次数
        for(int i = 0;i<numsSize;i++){
            opt += (nums[i] - 1)/mid;//等于下面三行
            //opt+=nums[i]/mid;//不能整除时,需要的拆分次数
            //if(0==nums[i]%mid)//能整除时,少拆分一次。
            //    opt--;
        }
        if(opt > maxOperations){//操作次数太多了,增加每个桶的最大值,以减少操作次数
            left = mid + 1;//左边界右移
        }else{
            right = mid -1;//右边界左移
        }
    }
    return left;//返回划分后,桶中最大值
}
  1. 时间复杂度 : O ( n l o g m ) O(nlogm) O(nlogm) n n n 是数组长度, m m m 是数组中的最大值,二分查找,对每个查找遍历数组的时间复杂度 O ( n l o g m ) O(nlogm) O(nlogm)
  2. 空间复杂度 : O ( 1 ) O(1) O(1) , 只使用常量级空间 。

AC

AC

致语

  • 二分查找是简单算法,但是要手熟。
  • 理解思路很重要!
  • 欢迎读者在评论区留言,墨染看到就会回复的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python3安装PIL库的经历

前提&#xff1a;我是在电脑上同时装了python2和python3 两个环境。详见 Windows环境同时安装多个版本的Python解释器&#xff08;python2和python3&#xff09;&#xff08;超详细&#xff09;_落墨画雪的博客-CSDN博客_安装多个版本python 首先&#xff0c;PIL官方版不支持py…

程序员能干到退休吗?写了40年代码的「骨灰级码农」给出了15条建议

寒冬、裁员、降薪、996、秃头、最近几年这些词汇不断在各位码农的周围盘旋。 很多程序员对自己目前的状态干到困惑和焦虑&#xff0c;而且这好像是国内外程序们都会遇到的问题。 最近&#xff0c;在Reddit上&#xff0c;一位干了40年程序员的网友发表了对这一问题的看法&#x…

辛二酰苯胺异羟肟酸/葛根素/黄芩苷β-环糊精(β-CD)环糊精包合物/β环糊精二棕榈脂质体制备

这里给大家分享的科研内容是辛二酰苯胺异羟肟酸/葛根素/黄芩苷β-环糊精(β-CD)环糊精包合物/β环糊精二棕榈脂质体的制备&#xff0c;和小编一起来看&#xff01; 黄芩苷β-环糊精(β-CD)环糊精包合物脂质体制备方法&#xff1a; 采用傅里叶红外变换光谱法(FTIR)确认了黄芩苷…

工控CTF之协议分析4——MQTT

协议分析 流量分析 主要以工控流量和恶意流量为主&#xff0c;难度较低的题目主要考察Wireshark使用和找规律&#xff0c;难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律&#xff0c;难可以难得五花八门 常见的工控协议有&#xff1a;Modbus、MMS、IEC60870、…

Appium基础 — Chrome Inspect定位工具

1、Chrome Inspect介绍 Chrome Inspect定位工具是用来抓取app中Webview页面的。 为了项目的需求&#xff0c;为了更好的保证效果和布局跨平台&#xff0c;Android&H5混合开发一般是我们不错的选择。Google浏览器中的Chrome Inspect定位工具&#xff0c;提供了一个移动端W…

(六)docker容器数据卷的理解和使用

目录 一、容器数据卷是什么 二、容器数据卷能干吗 三、宿主vs容器之间映射添加容器卷 四、读写规则映射添加说明 五、卷的继承和共享 一、容器数据卷是什么 Docker将运行的环境打包形成容器运行&#xff0c; Docker容器产生的数据&#xff0c;如果不通过docker commit生成…

【软件测试】快速迭代的敏捷项目?测试怎么做?测试人怎么提升自我价值......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 提到敏捷项目时&…

【嵌入式】Linux开发工具arm-linux-gcc安装及使用

知识架构及层次 — 程序编译及调试 嵌入式交叉编译器安装配置 宿主机 执行编译、链接嵌入式软件的计算机 目标机 运行嵌入式软件的硬件平台 “本地”编译器 用来生成在与编译器本身所在的计算机和操作系统&#xff08;平台&#xff09;相同的环境下运行的目标代码&#xff0c…

【2023 海光 笔试题】~ 题目及参考答案

文章目录1. 前言2. 题目 & 答案第1题第2题3. 回忆杀4. 关于存储芯片声明1. 前言 今天分享的是海光的关于IC验证的笔试部分题目&#xff01;&#xff01;&#xff01;名称如标题所示&#xff0c;希望大家正确食用&#xff08;点赞转发评论&#xff09; 本次笔试题一共三部分…

l2逐笔接口如何如何查询委托明细?

l2逐笔接口进出行查询逐笔委托明细目前只支持电脑端&#xff0c;需要在登录进页面后在个股分时页面的右边需要双击或回车操作&#xff0c;找到行情资讯单元&#xff0c;再选择Level2单元。并且l2逐笔接口对A股的数据调用就是利用api结构来验证和存储数据&#xff0c;相当于一个…

leetcode.1760 袋子里最少数目的球 - 反向二分(二分答案)

1760. 袋子里最少数目的球 思路&#xff1a; 你的开销是单个袋子里球数目的 最大值 &#xff0c;你想要 最小化 开销。 题目出现&#xff1a;最大值最小&#xff0c;最小值最大 则是二分题 已知开销值y越大&#xff0c;操作数越小&#xff0c;则问题具有单调性&#xff0c;可以…

微信小程序 | 小程序的事件处理

&#x1f5a5;️ 微信小程序 专栏&#xff1a;小程序的事件处理 &#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; ✨ 个人主页&#xff1a;CoderHing的个人主页 &#x1f340; 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ &#x1f44…

怎么智能配音?推荐几个比较实用的配音方法给你

现在我们的生活变得越来越便捷化&#xff0c;越来越多的新鲜事物出现在我们的眼前&#xff0c;比如配音。随着短视频的火爆&#xff0c;相信屏幕前的你也剪辑过视频吧。给视频剪辑的过程中&#xff0c;为视频中的文字内容进行配音是一个必不可少的剪辑步骤&#xff0c;这样可以…

数字孪生智慧场馆项目应用场景展示

近年来,发展"数字经济"和建设"数字孪生城市"相继被提升为国家发展战略, 如何运用数字孪生技术活化体育场馆运用场景成了场馆智慧化建设道路上需要思考的问题。 数字孪生智慧场馆项目 北京智汇云舟科技有限公司成立于2012年&#xff0c;专注于创新性的“视…

IOT知识记录

文章目录物联网程序设计GPIO 端口配置结构体定义 //代码规范样例NB模组运行流程LORAWAN模组1. 基础知识&#xff1a;2. 运行流程&#xff1a;4G 和WIFIGPRSPDN与APNPDP上下文和PDP地址APN&#xff1a;APN即“接入点名称”物联网 程序设计 程序框架的规划各个模块功能的细分系…

氧饱夹语音芯片,内置功放直推喇叭输出,低成本语音IC,WTN6系列

血氧夹能够实时检测用户当前的血氧饱和度&#xff0c;相比于传统没有嵌入语音芯片的血氧夹&#xff0c;只有一个显示屏&#xff0c;无法直观知道当前血氧是正常还是偏低&#xff0c;需要用户查阅一些资料/问客服如何使用&#xff0c;大大降低了产品的体验&#xff1b; 添加了语…

界面控件DevExpress WPF中文指南 - 主题设计器工作区介绍

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF的Them…

统一自己的mac和linux环境的终端使用(alacritty+tmux代替iterm2)

升级切换了下自己的终端工具tmux配置&#xff0c;终端工具从iterm2改到了alacritty。 为什么切换终端 快。 alacritty使用GPU进行渲染&#xff0c;可以做到其他无法实现的性能优化。小。 iterm2快40m&#xff0c;alacritty只有10m&#xff0c;当然这个只能算小优点&#xff0…

flex换轴,布局,语法,移动端

物理分辨率&#xff1a; 硬件所支持的&#xff0c;屏幕出厂就设定无法修改逻 辑分辨率&#xff1a; 软件可以达到的&#xff0c; 我们开发中写的是逻辑分辨率 视口&#xff08;viewport&#xff09;就是浏览器显示页面内容的屏幕区域。 <meta name"viewport" c…

栈的分类以及应用场景

栈的本质就是一段内存&#xff0c;程序运行时用于保存一些临时数据。栈大体可以分为四种类型空增、空减、满增、满减。ARM处理器一般使用满减栈。 目录 1、栈的分类 2、压栈/出栈的两种实现方式 (1) 方式一&#xff1a;使用后缀DB / IA (2) 方式二&#xff1a;使用后缀FD …