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

news2025/3/6 11:36:01

来源:力扣(LeetCode)

描述:

给你一个整数数组 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

方法:二分查找

思路与算法

我们可以将题目中的要求转换成判定问题,即:

给定 maxOperations 次操作次数,能否可以使得单个袋子里球数目的最大值不超过 y。

如果 y = y0 是一个满足要求的答案,那么所有大于 y0 的 y 同样也是满足要求的。因此存在一个 y = yopt,使得当 y ≥ yopt 时都是满足要求的,当 y < yopt 时都是不满足要求的。这个 yopt 就是最终的答案。

因此,我们可以通过二分查找的方式得到答案。二分查找的下界为 1,上界为数组 nums 中的最大值,即单个袋子中最多的球数。

当我们二分查找到 y 时,对于第 i 个袋子,其中有 nums[i] 个球,那么需要的操作次数为:

1
其中 ⌊x⌋ 表示将 x 进行下取整。它的含义为:

  • 当 nums[i] ≤ y 时,我们无需进行操作;
  • 当 y < nums[i] ≤ 2y 时,我们需要进行 1 次操作;
  • 当 2y < nums[i] ≤ 3y 时,我们需要进行 2 次操作;

  • 那么总操作次数即为:

2
当 P ≤ maxOperations 时,我们调整二分查找的上界,否则调整二分查找的下界。

代码:

class Solution {
public:
    int minimumSize(vector<int>& nums, int maxOperations) {
        int left = 1, right = *max_element(nums.begin(), nums.end());
        int ans = 0;
        while (left <= right) {
            int y = (left + right) / 2;
            long long ops = 0;
            for (int x: nums) {
                ops += (x - 1) / y;
            }
            if (ops <= maxOperations) {
                ans = y;
                right = y - 1;
            }
            else {
                left = y + 1;
            }
        }
        return ans;
    }
};

执行用时:128 ms, 在所有 C++ 提交中击败了70.57%的用户
内存消耗:54.7 MB, 在所有 C++ 提交中击败了23.70%的用户
复杂度分析
时间复杂度:O(nlogC),其中 n 是数组 nums 的长度,C 是数组 nums 中的最大值,不超过 109 。空间复杂度:O(1)。
author:LeetCode-Solution

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

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

相关文章

开发板到货记录一波

今天在终于拿到了期待已久的开发板RK3568&#xff0c;来&#xff0c;亮个相吧&#xff01;&#xff01;&#xff01; 开发板资源还是相当丰富的&#xff0c;对于学习安卓&Linux都是非常友好的&#xff0c;开发板默认安装的是安卓11系统&#xff0c;由于经费问题目前还没有…

小米发明“永动机”:走路即可为智能设备充电

蓝牙耳机、智能智能手表、智能手环、智能眼镜、智能手机……随着科技的进步&#xff0c;越来越多的移动与可穿戴智能设备开始走进我们的生活&#xff0c;智能设备在给人们生活带来便利的同时&#xff0c;也带来了一些困惑&#xff0c;越来越多诸如手环、TWS耳机等智能穿戴设备&…

火热的元宇宙,成为未来趋势

近年来&#xff0c;中国在算力上突飞猛进&#xff0c;有望成为世界顶尖&#xff0c;再加数据和算法上的优势&#xff0c;中国就很有可能在元宇宙方面率先开发出原创性的技术&#xff0c;从而实现从“0”到“1”的突破。 元宇宙办公 在未来的元宇宙畅想中&#xff0c;人们不仅…

java Lambda表达式的标准格式及其前提带有(代码演示)

观看本文 首先 你要对Lambda的概念有个基本了解 对此 您可以先查看我的文章 java Lambda概念 通过实现线程简单体验一下Lambda表达式 跟着上一篇文章做 你的代码会是这样 new Thread( () ->{System.out.println("执行线程"); } ).start();而其中Lambda 表达式 则…

资产种类多数量大、使用地点分散?集中管理,一招搞定

随着银行规模不断壮大&#xff0c;资产数量也随之不断增加&#xff0c;同时银行资产具有总量大、价值高、使用地点分散、管理难度大的特点&#xff0c;IT资产、房产、办公用品、维修保养需求随着业务的快速增长对管理工作带来了压力。 传统资产管理4大痛点 01.账实不符 实物账…

【Python机器学习】神经网络中常用激活函数、损失函数、优化方法(图文解释 附源码)

下面以经典的分类任务&#xff1a;MNIST手写数字识别&#xff0c;采用全连接层神经网络 MNIST数据集是一个手写体的数字图片集&#xff0c;它包含有训练集和测试集&#xff0c;由250个人手写的数字构成。训练集包含60000个样本&#xff0c;测试集包含10000个样本。每个样本包括…

数据结构基础--散列表

一、散列简介 散列表&#xff0c;又叫哈希表&#xff08;Hash Table&#xff09;&#xff0c;是能够通过给定的关键字的值直接访问到具体对应的值的一个数据结构。也就是说&#xff0c;把关键字映射到一个表中的位置来直接访问记录&#xff0c;以加快访问速度。 通常&#xff0…

Android设计模式详解之建造者模式

前言 Builder模式是一种创建型设计模式。 定义&#xff1a;将一个复杂对象的创建与它的表示分离&#xff0c;使得同样的构造过程可以创建不同的表示。 使用场景&#xff1a; 相同的方法&#xff0c;不同的执行顺序&#xff0c;产生不同的事件结果时&#xff1b;多个部件或零…

java学习day63(乐友商城)商品新增后台、商品编辑后台、搭建前台系统页面

1.商品新增 当我们点击新增商品按钮&#xff1a; 就会出现一个弹窗&#xff1a; 里面把商品的数据分为了4部分来填写&#xff1a; 基本信息&#xff1a;主要是一些简单的文本数据&#xff0c;包含了SPU和SpuDetail的部分数据&#xff0c;如 商品分类&#xff1a;是SPU中的cid1&…

大型项目都会使用到的Makefile

一、vi编辑器之神 1.vi编辑器的三种模式&#xff1a; 插入模式&#xff1a;可以编辑文档 编辑模式&#xff1a;可以敲一些命令&#xff0c;执行例如复制n行 剪切n行 &#xff0c;粘贴等功能 命令模式:(最后一行模式&#xff09; 在此模式下可以保存文件&#xff0c;退出vi…

第03讲:Redis的持久化方案

前言 redis是一个内存数据库&#xff0c;当redis服务器重启&#xff0c;获取电脑重启&#xff0c;数据会丢失&#xff0c;我们可以将redis内存中的数据持久化保存到硬盘的文件中。 redis提供两种持久化方式: RDB&#xff1a;快照&#xff0c;通过从服务器保存和持久化AOF&…

Codeforces Round #839 (Div. 3) A~G all answer

Dashboard - Codeforces Round #839 (Div. 3) - Codeforces 最近状态奇差无比&#xff0c;还有点生病&#xff0c;低烧反复横跳&#xff0c;应该没阳&#xff1f;&#xff08;虽然家人都阳了&#xff0c;就剩我一个了wuwuwu&#xff5e;&#xff08;A B C就不作解释了&#xff…

【小5聊】Python3 使用selenium模块实现简单爬虫系列一

第一次听说Python还是在工作的时候&#xff0c;还是一位女生在用&#xff0c;当时她说可以用来处理excel文档&#xff0c;特别是一些统计分析。第二次让我真正进入python世界&#xff0c;还是在一次C站举办的大赛上。聊聊你是因为什么机缘巧合进入到python圈的呢&#xff1f;不…

金盾杯2022-AGCTFS战队 wp

文章目录Web图书馆EzPHPeZphp2SQLSkip有来无回反败为胜Crypto小菜一碟RRSSAAsimpleRrandMISC盗梦空间qianda0_Sudoku数据泄露01-账号泄露追踪数据泄露02-泄露的密码数据泄露03-泄露的密钥ReverseTeaPwnLoginWtfWeb 图书馆 根据提示找到 干货&#xff5c;最全的Tomcat漏洞复现…

Qt5 网页标题、关键词提取工具Findyou

Qt5 网页标题、关键词提取工具Findyou 一、程序运行 运行界面 辅助功能&#xff0c;可用于将扫描器的扫描结果转换为url 二、所涉及的重要知识点 1、Qt爬取https的网页 来自宇龍_ https://blog.csdn.net/qq_45809384/article/details/122049295?spm1001.2014.3001.5506 打…

Foxmail客户端添加163账号和邮件备份163邮箱

文章目录一、Foxmail添加163账号1. 点击图标2. 账号管理3. 新建4. 手动设置5. 填写信息6. 创建二、邮件转移备份2.1. 邮件折叠2.2. 选择目标邮箱2.3. 同步服务端Foxmail客户端添加163账号的具体步骤如下&#xff1a;一、Foxmail添加163账号 1. 点击图标 首先打开Foxmail客户端…

51寻找数组中出现次数超一半的数

51寻找数组中出现次数超一半的数 一看题目就想用hash表&#xff0c;但是要求空间复杂度为1&#xff0c;说明不可以用哈希表去存。一直在原地数组上思考&#xff0c;类似桶排序&#xff0c;可是这取决于数值的大小&#xff0c;最后还是看了题解&#xff0c;学到了。 思想是&…

外汇天眼:一笔赚了12600美元 你羡慕吗?

在外汇投资中&#xff0c;黑平台一直是外汇投资圈的一枚毒瘤&#xff0c;不能顺利出金也是外汇投资面临的最大风险之一。 对于外汇投资者而言&#xff0c;外汇交易平台的选择至关重要。 选择好的外汇交易平台&#xff0c;最重要的是&#xff1a;选择安全可靠的平台&#xff0…

Blackmagic黑魔法摄像机braw视频帧损坏文件修复方法

Blackmagic是全球知名的影视级产品供应商&#xff0c;其高清摄像机是国内外各种剧组的最爱。Blackmagic的新产品目前使用braw格式&#xff0c;其编码采用自定义的raw编码&#xff0c;视频的效果和阿莱不相上下。之前我们已经多次介绍过这种braw文件的修复&#xff0c;近期我们处…

grpc的使用

GRPC学习 本文包括grpc的入门使用和四种实现方式 文章目录一、GRPC 安装和hello world1、什么是GRPC2、安装grpc和代码3、服务端3.1、取出 server3.2、挂载方法3.3、注册服务3.4、创建监听4、客户端二、protobuf语法三、GRPC server 的使用1、普通服务2、流式传入&#xff08;客…