【LeetCode】1760. 袋子里最少数目的球

news2025/2/2 10:48:15

袋子里最少数目的球

给你一个整数数组 nums ,其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations

你可以进行如下操作至多 maxOperations 次:

选择任意一个袋子,并将袋子里的球分到 2 个新的袋子中,每个袋子里都有 正整数 个球。
比方说,一个袋子里有 5 个球,你可以把它们分到两个新袋子里,分别有 1 个和 4 个球,或者分别有 2 个和 3 个球。

你的开销是单个袋子里球数目的 最大值 ,你想要 最小化 开销。

请你返回进行上述操作后的最小开销。

示例 1

输入:nums = [9], maxOperations = 2
输出:3
解释:
- 将装有 9 个球的袋子分成装有 6 个和 3 个球的袋子。[9] -> [6,3]- 将装有 6 个球的袋子分成装有 3 个和 3 个球的袋子。[6,3] -> [3,3,3] 。
装有最多球的袋子里装有 3 个球,所以开销为 3 并返回 3

示例 2

输入:nums = [2,4,8,2], maxOperations = 4
输出:2
解释:
- 将装有 8 个球的袋子分成装有 4 个和 4 个球的袋子。[2,4,8,2] -> [2,4,4,4,2]- 将装有 4 个球的袋子分成装有 2 个和 2 个球的袋子。[2,4,4,4,2] -> [2,2,2,4,4,2]- 将装有 4 个球的袋子分成装有 2 个和 2 个球的袋子。[2,2,2,4,4,2] -> [2,2,2,2,2,4,2]- 将装有 4 个球的袋子分成装有 2 个和 2 个球的袋子。[2,2,2,2,2,4,2] -> [2,2,2,2,2,2,2,2] 。
装有最多球的袋子里装有 2 个球,所以开销为 2 并返回 2

示例 3

输入:nums = [7,17], maxOperations = 2
输出:7

提示

  • 1 <= nums.length <= 105
  • 1 <= maxOperations, nums[i] <= 109

算法一:二分查找

思路

  • 首先给出一个定义:「给定花销 mid , 能否在 maxOperations 次操作内使得盒子里所有的数都小于等于 mid

  • mid 越小,所需要的操作次数越多,因此就有了单调性,可以用二分查找来做。如果我们要将最大值降低至 target ,可以计算一下需要多少操作数(每个数大于 target 的数都要尽可能均分),分为以下两种情况:

    若操作数大于 maxOperations ,说明 target 太小了,需要往右搜索,否则需要往左搜索。

  • 那么如何计算操作次数 呢?

    • 对于一个数 x ,如果它小于等于 mid , 那么不用划分。

    • 如果大于 mid ,那么需要进行划分。

      当 x 位于 [ mid + 1 , mid * 2 ] ,需要划分一次,位于 [ mid * 2 + 1 ,mid * 3] ,需要划分两次,因此可以看出需要划分次数为 : (x - 1) / mid 。

收获

  • 二分查找
    能否二分答案的关键在于问题是否具有决策单调性。也即考虑整个数轴,左边一半满足条件,右边不满足;或者左边一半不满足,右边满足。

    通过这道题复习了二分查找。

算法情况

  • 时间复杂度 :O(n log C), 其中 n 是 nums 的长度,C 是数组 nums 中的最大值, 不超过 109
  • 空间复杂度:O(1)
    在这里插入图片描述

代码

class Solution {
public:
    int minimumSize(vector<int>& nums, int maxOperations) {
        int left = 1, right = *max_element(nums.begin(), nums.end());
        int res = 0;
        while(left <= right){
            int mid = (left + right) / 2;
            long long ops = 0;
            for(int num : nums){
                ops += (num - 1) / mid;
            }
            if(ops <= maxOperations){
                // 操作次数少,说明mid太大,减小mid
                res = mid;
                right = mid - 1;
            }
            else{
                // ops > maxOperations
                // mid太小,增大mid
                left = mid + 1;
            }
        }
        return res;
    }
};

参考资料

  1. C++ max_element()的使用

max_element是用来来查询最大值所在的第一个位置。(不是下标,比如 [1, 2 , 3 ],会返回 3 )

max_element有两种写法:

  • 第一种是从头迭代器到尾迭代器用自己写的方法去比较,
  • 第二种是直接用它自带的头迭代器到尾迭代器的比较大小。
  1. 二分查找又死循环了?一个视频讲透二分本质!

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

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

相关文章

媒体查询。

媒体查询( Media Query )是CSS3新语法 使用media查询&#xff0c;可以针对不同的媒体类型定义不同的样式 media 可以针对不同的屏幕尺寸设置不同的样式 当你重置浏览器大小的过程中&#xff0c;页面也会根据浏览的宽度和高度重新渲染页面 目前针对很多苹果手机、Android手机&am…

【算法】【字符串模块】字符串数组中两个字符之间的最短距离以及对hashcode以及equals的理解

目录前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本思考感悟写在最后前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介绍 …

来聊一聊|ConcurrentModificationException异常的解决

一. 前言 最近耀哥的一个学生&#xff0c;在使用使用ArrayList的subList的时候&#xff0c;发生了ConcurrentModificationException的异常。耀哥觉得这个现象非常具有代表性&#xff0c;估计有不少同学都会在同样的问题上犯迷糊&#xff0c;所以今天耀哥特意把这个问题记录下来…

设备台账管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 模块划分&#xff1a;公告类型、公告信息、员工信息、仓库信息、设备类型、设备信息、供应商信息、采购信息、设备调拨、…

8个Spring事务失效的场景,你碰到过几种?

前言 作为Java开发工程师&#xff0c;相信大家对Spring种事务的使用并不陌生。但是你可能只是停留在基础的使用层面上&#xff0c;在遇到一些比较特殊的场景&#xff0c;事务可能没有生效&#xff0c;直接在生产上暴露了&#xff0c;这可能就会导致比较严重的生产事故。今天&a…

基于Android7 的msm8953芯片的nfc调试

目录 报错日志 NFC芯片重要的5个引脚 时序图分析 报错日志 01-01 19:05:22.570 0000 2341 2532 D NxpFwDnld: phDnldNfc_InitImgInfo:SUCCESS 01-01 19:05:22.570 0000 2341 2532 D NxpFwDnld: Processing Normal Sequence.. 01-01 19:05:22.570 0000 2341 2532 D NxpFwD…

干货|PCB电路板的组成、设计、工艺、流程及元器摆放和布线原则

大家对PCB电路板电路这个词很熟&#xff0c;有的了解PCB电路板的组成&#xff0c;有的了解PCB电路板的设计步骤&#xff0c;有的了解PCB电路板的制作工艺......但是对整个PCB电路板的组成、设计、工艺、流程及元器摆放和布线原则&#xff0c;及后期的注意事项没有一个综合的了解…

Spring 中 ConfigurationClassPostProcessor 类扫描解析之 @ComponentScan 解析

ConfigurationClassPostProcessor 简单概述 Spring 中类的解析是非常重要的&#xff0c;因为工程中有很多类&#xff0c;并且被一些注解修饰&#xff0c;比如&#xff1a;Component、Bean、Import、PropertySource、ImportSource、Scope 等。 你在类或者方法上标注这些注解&a…

Tensorflow1 搭建Cuda11

前言 Tensorflow1中默认支持cuda10及以下的&#xff0c;最高的版本Tensorflow1.15默认使用cuda10&#xff1b;但是一些高性能的显卡&#xff0c;比如A100、3090等&#xff0c;它们只支持Cuda11的&#xff0c;这就不太友善了&#xff0c;毕竟不少项目依赖Tensorflow1搭建的。 …

linux基础学习-系统信息相关命令以及一些其他命令

主要是为了方便远程终端维护服务器时&#xff0c;查看服务器上当前的 系统日期和时间/磁盘空间占用情况/程序执行命令时间和日期 磁盘信息 -h&#xff1a;以人性化的方式显示文件大小进程信息 进程通俗地说就是当前正在执行的一个程序 ps默认只会显示当前用户通过终端启动的…

使用 openpyxl 在 Excel 电子表格中自动执行日常任务

花费数小时处理 Excel 中平凡的重复性任务。使用 Python 和 openpyxl 探索自动化。 像许多从事各种业务职能的人一样,我几乎每天都使用 Excel 来制作图表和分析。然而,其中一些图表需求相当平凡,涉及使用新的原始数据集创建新的工作表,该数据集需要以某种可预测的形式进行处…

采购管理基础知识:采购方法、模式与数据的作用

采购是任何企业的一个关键部分&#xff0c;是从外部来源获得货物和服务的过程。采购的目标是为企业获得尽可能好的价值。 采购流程可以通过使用各种工具进行优化。最重要的工具是采购管理软件。这种软件可以帮助企业跟踪他们的采购过程&#xff0c;并确保它们是有效的。 采购…

javaweb当中mysql要掌握的知识点(简单基础入门)

目录 1.mysql的数据模型 A.关系型数据库 B.mysql的客户端和数据库间的关系 C.数据库当中不同文件控制表的相关数据 2.使用注释 A.使用井号#加上要注释的文字 3.DDL---操作数据库 A.基本操作 B.创建表 C.修改表 D.给表添加数据 E.基础查询 F.排序查询语法 G.分页查询 4.…

linux下的环境变量

环境变量查看环境变量方法环境变量的组织方式通过代码如何获取环境变量 查看环境变量方法 环境变量的组织方式通过代码如何获取环境变量查看环境变量方法 环境变量的组织方式 通过代码如何获取环境变量 查看环境变量方法 ./常见的环境变量. 1️⃣ PATH:指定命令的搜索路径 2…

有哪些好用的建筑工程项目管理软件?

工程项目管理是建筑企业经营管理的核心业务&#xff0c;任何一家施工企业、任何一个工程管理团队&#xff0c; 无论是建立初创型企业&#xff0c;还是小公司开始进行业务扩张时&#xff0c;工程项目管理都至关重要。 针对行业痛点&#xff0c;推荐试试这款系统&#xff1a;ht…

银河麒麟V10系统NetworkManager服务启动失败的解决方法

目录 一、NetworkManger网络服务启动失败 二、故障定位过程 &#xff08;一&#xff09;重装NetworkManager未解决 &#xff08;二&#xff09;重装openssl未解决 三、解决方案 &#xff08;一&#xff09;修改/etc/ld.so.conf配置文件 &#xff08;二&#xff09;执行ld…

实操干货!专利的12种用处。

对于专利申请人和企业来说&#xff0c;为什么要申请专利以及申请到的专利能有什么作用&#xff1f; 答案可能会有很多种&#xff0c;小编在本文中列举了12种。你的理由是什么呢&#xff1f;可以在文后留言与我们进行互动交流。 几十年来中国专利申请数量已足足有几百万&#x…

C语言 CJSON使用实例

C语言 CJSON使用实例 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录C语言 CJSON使用实例前言一、cJSON实例1. json数据的封装2. json数据解析前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a…

【小5聊】Sql Server时间转换和查询时间范围查询不正确的原因

最近在做时间方法封装的时候发现了一个问题&#xff01; 如果sql语句输出的时间字段转为了字符串输出&#xff0c;那么在使用此字段作为时间范围筛选时发现无效了&#xff0c;没法过滤对应的时间范围内记录 下面进行场景重现下 1、创建表 创建只有三个字段的表testTable&…

LeetCode:1760. 袋子里最少数目的球

解题思路&#xff1a; 看了很久也不知道该怎么下手&#xff0c;果断转去题解看答案&#xff0c;所实话官方的题解说的有些抽象&#xff0c;先买那是我自己看了别人的博客和思考后的一些思路&#xff1a; 1、为什么可以用二分查找&#xff1f; 题目要求你的开销是单个袋子里球…