二分搜索算法(以力扣周赛“每个小孩最多分到多少糖果”为例)

leetcode之candy(孩童分糖果,求糖果最小数量) 题 目 There are N children standing in a line. Each child is assigned a rating value. You are giving candies to these children subjected to the following requirements: Each child must have at least one ... 阅读详情

上午刚刚打完力扣周赛,感觉心有余而力不足,好多次都有这么一种差一点就AC的感觉,所以归根结底还是自己基础不牢的缘故,借着有感记录下二分搜索算法的解法,也祭奠下自己第287场周赛的再次失败!

二分搜索算法的关键在于:

(1)定义好左、右侧边界,左侧边界是否包含,右侧边界是否包含。

(2)考虑好while循环条件,是在left<right还是left<=right。

(3)根据(1)中左、右侧边界是否包含的设置,在收缩的过程中处理好加一,减一的问题。

强烈推荐如下的二分搜索算法模板,:

搜索右侧边界:

int left = 左侧边界(包含)

int right = 右侧边界(不包含)

while(left < right){//循环条件在搜索左、右侧边界时两者相同时退出即可
                    //因为设置的范围为左闭右开,没必要等到两者相等

    int mid = left + (right-left)/2

    if(number[mid] == target)

        left = mid+1;//找到符合要求的数后别着急返回,收缩左边界继续搜索右边界

    else if(number[mid] > target)

        right = mid;//数过大,收缩右边界(因刚开始设置为右侧边界不包含,所以不加1)

    else if(number[mid] < target)

        left = mid+1;//数过小,收缩左边界(因刚开始设置为左侧边界包含,所以需要加1)

}

    return left-1;//返回mid,mid =  right-1(因为右侧边界是不包含的) = left-1;

搜索左侧边界:

 

int left = 左侧边界(包含)

int right = 右侧边界(不包含)

while(left < right){//循环条件在搜索左、右侧边界时两者相同时退出即可
                    //因为设置的范围为左闭右开,没必要等到两者相等

    int mid = left + (right-left)/2

    if(number[mid] == target)

        right = mid;//找到符合要求的数后别着急返回,收缩右边界继续搜索左边界

    else if(number[mid] > target)

        right = mid;//数过大,收缩右边界(因刚开始设置为右侧边界不包含,所以不加1)

    else if(number[mid] < target)

        left = mid+1;//数过小,收缩左边界(因刚开始设置为左侧边界包含,所以需要加1)

}

    return left;//返回mid,mid = left(因为左侧边界包含) = right;

 搜索某个数:

int left = 左侧边界(包含)

int right = 右侧边界(包含)

while(left <= right){//在搜索某个数时需要在两者相同时再搜索一次,避免漏掉两者相同时位置的这个数。

    int mid = left + (right-left)/2

    if(number[mid] == target)

        return mid;//找到符合要求的数后返回即可,没必要继续搜下去了

    else if(number[mid] > target)

        right = mid-1;//数过大,收缩右边界(因刚开始设置为右侧边界包含,所以需要减1)

    else if(number[mid] < target)

        left = mid+1;//数过小,收缩左边界(因刚开始设置为左侧边界包含,所以需要加1)

}

    return -1;//返回-1,代表在这个范围内搜不到想要的数

下面将结合力扣周赛题目讲解下如何应用。

题目是这样的:

 首先对题目进行分析可知:

(1)当糖果总数小于小孩个数时,我们是没办法分糖果的。所以这种情况应该考虑排除,思路也很简单,先计算糖果的总数,如果糖果总数小于小孩个数则直接返回0。

(2)当糖果总数大于等于小孩个数时,我们需要考虑最大化每个小孩能够得到的糖果数,那么在理想情况下,每个小孩能得到的糖果数最多必然是——糖果总数/小孩个数。但我们从题目中可以看到,这种情况的发生毕竟还是太过理想,毕竟并不是每堆糖果的数量都会大于平均数,那怎么办呢?很明显,我们需要在[1,糖果总数/小孩个数]的范围内找到最大的数,暂且记为n,使得candies中每个数/n的和能够大于k,这也就转化为二分搜索中的右侧边界搜索问题。

那么解法也就随之而来了:

class Solution {

public:

    int maximumCandies(vector<int>& candies, long long k) {

        long long sum = 0;// 用来记录糖果总数

        int len = candies.size();

        //遍历得到糖果总数
        for(int i=0; i<len; ++i){

            sum += candies[i];

        }

        // 糖果总数小于小孩个数直接返回0,别犹豫。
        if(sum < k){

            return 0;

        }

        // 范围为[1,糖果总数/小孩数],我们需要转化一下,转为左闭右开的范围,也就是[1,糖果总数/小孩数+1)
        int left = 1, right = sum / k + 1;

        while(left < right){// 循环条件不包含相等的情况,因为我们定义的是左闭右开

            int mid = left + (right - left)/2;// 计算中间值

            long long number = 0;// 计算根据当前mid值能够将糖果分为多少堆,每个堆含有mid个糖果

            for(int i=0; i<len; ++i){

                number += candies[i] / mid;

            }

            if(number > k){// 说明mid值过小,虽然够均等分给k个小孩,但是小孩是贪心的呀,需要更多,所以继续搜索

                left = mid+1;

            }else if(number < k){// 说明mid值过大,不够均等分给k个小孩,分配不均容易引起小孩吵闹

                right = mid;

            }else{// 说明mid值正好能够均等分给k个小孩,但是不要着急返回呀,我们还要继续搜索,寻找有没有可能存在比当前值更大的数也能均等分给k个小孩,所以收缩左侧边界去继续搜索右侧边界。

                left = mid+1;

            }

        }

        return left-1; //返回右侧边界right-1=left-1,因为刚开始定义为左闭右开,所以最后返回右侧值right-1。

    }

};

LeetCode 公平的糖果交换(二分法、hash表) 爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝拥有的第 i 块糖的大小,B[j] 是鲍勃拥有的第 j 块糖的大小。 因为他们是朋友,所以他们想交换一个糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。) 返回一个整数数组 ans,其中 ans[0] 是爱丽丝必须交换的糖果棒的大小,ans[1] 是 Bob 必须交换的糖果棒的大小。 如果有多个答案,... 阅读详情

相关推荐

基于PID的定速巡航控制系统设计【MATLAB源码+Word文档】

本文详细介绍了定速巡航控制是一种车辆驾驶辅助系统,它能让驾驶者在高速或长途驾驶时,设定一个固定的车速,然后车辆会自动维持这个速度行驶,无需驾驶者持续踩油门。这大大减轻了驾驶者的疲劳,同时也提高了行驶的安全性。PID定速巡航控制系统是一种利用比例(Proportional)、积分(Integral)和微分(Derivative)控制算法来实现车辆定速巡航的先进系统。这种系统能够根据设定的速度,自动调整油门开度或制动力度,使车辆保持恒定的速度行驶。这种控制系统具有响应速度快、控制精度高、稳定性好等优点。

weixin_761237174的博客 1667

算法—分配糖果

** 一、题目 有N个孩子站成一排,每个孩子有一个分值。现在你需要为这些孩子分配糖果,但需要满足下面的需求: 每个孩子至少分一个。 拥有较高分值的孩子得到的糖果要比与他相邻的孩子得到的数量多 那么最少需要给这些孩子分配多少糖果? 二、分析 三、代码实现 public static int candy(int[] ratings) { /** * pre:前面元...

旅途 3038

SAP 财务接口开发:完全清账 vs 标准过账的 CO-PA(获利能力字段) 赋值全解析(含设计哲学)

用于完全清账场景:用于标准凭证过账/部分清账两者对 CO-PA 数据的传递方式截然不同。本文不仅提供完整的代码实现,更深入解析为什么 SAP 要这样设计——了解设计哲学,才能灵活应对各类需求。完全清账→ 调用,必须在T_FTPOST中传递,其他特征用BSEG-RKE_前缀。标准过账/部分清账→ 调用,在CRITERIA表中传递特征,字段名直接用WERKSARTNR等。SAP 的设计智慧面向不同场景,采用不同机制,各司其职。通过接口抽象,将复杂的 CO-PA 配置逻辑封装在内部,对外提供简洁的调用方式。

Pegasus666的博客 326

100个python算法超详细讲解:分糖果

1.问题描述 10个小孩围成一圈分糖果,老师分给第1个小孩10块,第2个小孩2块,第3个小 孩8块,第4个小孩22块,第5个小孩16块,第6个小孩4块,第7个小孩10块,第8个小 孩6块,第9个小孩14块,第10个小孩20块。然后所有的小孩同时将手中的糖分一半 给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的 糖一样多?每人各有多少块糖? 2.问题分析 根据题意,10个小孩开始时所拥有的糖果数是不同的,但分糖的动作却是相同 的,即“所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为

Lee达森的博客 3610

从ST电机库到TI InstaSPIN:手把手对比两种主流FOC实现中的坐标变换差异

本文深入对比了ST电机库与TI InstaSPIN在FOC实现中的坐标变换差异,包括坐标系定义、变换系数和角度处理等关键点。针对BLDC和PMSM电机控制,提供了从理论到实践的移植方案,帮助工程师快速解决平台切换中的性能问题。特别解析了Clarke/Park变换在两种实现中的微妙差异及其对PI控制的影响。

weixin_28724661的博客 397

用Cloudflare Worker搭建你的私人Gemini Pro API

文章介绍如何通过开源项目gemini-cli-openai将谷歌Gemini模型转换为兼容OpenAI API的服务,解决Gemini CLI的三大使用障碍:网络访问、命令行操作和生态整合问题。部署流程主要包括获取Google OAuth2凭证、配置Cloudflare Worker项目并设置KV存储,最终可在CherryStudio等图形客户端中调用Gemini。该方法利用Cloudflare全球网络实现加速访问,同时保持认证信息安全可控。

Hsiao的二进制生活 1681

【算法】【算法杂谈】分糖果问题

分糖果问题

qq_39760347的博客 1394

逆向分析第一步:如何从HEX文件‘还原’出单片机的原始程序与数据?

本文详细解析了如何从HEX文件逆向分析出单片机的原始程序与数据,涵盖了固件逆向的底层逻辑与实践。通过介绍HEX文件的结构、内存映像重建技术以及专业工具链的使用,帮助读者掌握从十六进制数据到可执行代码的完整流程,适用于嵌入式系统开发和逆向工程领域。

weixin_29745609的博客 313

【二分--分堆】-LeetCode-2226. 每个小孩最多能分到多少糖果

2226. 每个小孩最多能分到多少糖果 提示: 1<=candies.length<=1051 <= candies.length <= 10^51<=candies.length<=105 1<=candies[i]<=1071 <= candies[i] <= 10^71<=candies[i]<=107 1<=k<=10121 <= k <= 10^121<=k<=1012 上周周赛的一

weixin_56915683的博客 574

TPS563201DDCR电路翻车实录:从原理图到PCB,我踩过的5个坑及补救方法

本文详细记录了使用TPS563201DDCR电源芯片设计电路时遇到的5个常见问题及解决方案,包括EN引脚配置、BST电容选型、反馈网络设计、PCB布局优化以及散热处理。通过实际案例和数据分析,帮助工程师避免类似错误,提升电源模块的可靠性和效率。

weixin_42532938的博客 527

告别手动标注!PDMS NakiToolkit插件安装与初体验:以Pipeline工具为例

本文详细介绍了PDMS NakiToolkit插件的安装与使用,特别是其Pipeline工具如何通过自动化标注和材料统计功能大幅提升三维工厂设计效率。从环境准备到实战演示,帮助工程师告别繁琐的手动标注工作,实现项目交付周期的大幅缩短。

weixin_30047059的博客 349

[二分答案]leetcode2226:每个小孩最多能分到多少糖果(medium)

题目: 题解: 思路:类比 2187. 完成旅途的最少时间 使用二分法,二分查找至少分成 k 份的最大糖果数。 二分查找的边界:下界为 0,表示 k 份都是 0 个糖果;上界为 sum(a)/k,表示所有糖果分成 k 份,每份的糖果数。至少分成 k 份的最大糖果数,就在这个区间内进行二分即可。每次判断 mid 值能否将 a 中每堆糖果按每份 mid 个分成大于等于 k 个人,然后来缩小区间即可。 代码如下: using LL = long long; class Solution { pub

algsup 1282

Copilot在游戏开发中的应用:Unity脚本自动生成实践

2021年GitHub Copilot的发布,为代码自动生成带来了革命性突破。作为基于GPT模型训练的AI辅助编程工具,Copilot能根据注释、函数名、代码上下文,实时生成符合语法和逻辑的代码片段,甚至完整脚本。减少重复劳动:自动生成模板代码(如生命周期、结构),让你专注核心逻辑;降低API学习成本:对Unity特有的组件(RigidbodyAnimator)、类(),Copilot能生成符合最佳实践的调用代码;统一代码风格:通过团队共享提示词模板,让生成的代码符合项目规范;快速原型迭代。

AIGC应用创新大全的博客 1616

D.二分查找-二分答案-求最大——2226. 每个小孩最多能分到多少糖果

D.二分查找-二分答案-求最小——2226. 每个小孩最多能分到多少糖果解析

要努力去发光,而不是被照亮~ 253

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[LeetCode周赛复盘] 第 325 场周赛20221225

T1暴力。T2滑窗。T3二分。T4背包。

liuliangcan的博客 707

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

分糖果问题-----medium

1、题目描述 力扣原题:原题链接 优秀题解:二分搜索类问题 力扣https://leetcode-cn.com/problems/maximum-candies-allocated-to-k-children/solution/by-relll-1037-dhhf/ 2、代码: class Solution { public int maximumCandies(int[] candies, long k) { //二分法 分糖果 int max =

weixin_50666824的博客 1399

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【算法文章2| 深度拆解:二分答案的“最大”与“最小”】

在开区间二分中,我们的目标是不断缩小范围,直到。此时,left和right正好指向了性质发生变化的分界点。二分查找本质上是在处理一个布尔数组(即 check 函数的结果)。由于数组具有单调性,它通常长这样:[false, false, …, false, true, true, …, true]或者反过来。当你寻找满足条件的最大值时,目标是找到从true变为false的那个瞬间。left必须指向一个确定的true值。right必须指向一个确定的false值。如果check(mid)为true,说明。

DdigitalNomad的博客 869

入门力扣自学笔记268 C++ (题目编号:2517)

2517. 礼盒的最大甜蜜度

DK_Sorhic的博客 621

LeetCode2226 分配给 K 个孩子的最大糖果数

由题目可知可用二分法来做。先写check函数如下。你可以将每个堆糖果放在任意数量的。糖果,有些糖果可能不会被分配。每个孩子,让每个孩子分配到。你需要将这些糖果分配给。磁盘中的每个元素表示。再将两个堆合并到一起。返回每个孩子可以拿走的。

weixin_46353892的博客 170

力扣2517题:礼盒的最大甜蜜度

给你一个正整数数组 price ,其中 price[i] 表示第 i 类糖果的价格,另给你一个正整数 k 。 商店组合 k 类 不同 糖果打包成礼盒出售。礼盒的 甜蜜度 是礼盒中任意两种糖果 价格 绝对差的最小值。 返回礼盒的 最大 甜蜜度。

qq_64175538的博客 406

二分题集 - 序列二

二分答案法的核心在于将原问题转化为判定问题,即对于一个猜测的答案,判断其是否可行。 check 函数的设计直接影响算法的效率和正确性,是二分答案法的关键部分。 贪心算法的应用:在 check 函数中,贪心策略常用于在局部做出最优选择,从而快速判断全局的可行性。 LeetCode-274. H 指数 寻找 h 指数的二分搜索方法 我们需要找到一个值 h,它满足「有 h 篇论文的引用次数至少为 h」。具体来说: 对于所有小于等于 h 的值 x,都满足至少有 x 篇论文的引用次数不低于

博客 500

动画学信奥 漫画学算法 CSP-J入门级 (三)、算法(依据「NOI大纲」)

3. 基础算法 贪心法 学不懂算法很烦恼? 快来看动画,学习贪心算法,LeetCode 分糖果 https://www.ixigua.com/6906764305388012035 学不懂算法很烦恼? 快来看动画,轻松学算法,贪心算法,LeetCode 455 分糖果 学不懂算法很烦恼? 快来看动画,轻松学算法,贪心算法,LeetCode 455 分糖果_哔哩哔哩_bilibili 程序员大厂面试必会算法 贪心算法中的经典题目 跳跃游戏 (LeetCode 55) 程序员大厂面试必

青少年趣味编程 2895

2023-06-01 LeetCode每日一题(礼盒的最大甜蜜度)

每日一题练习,每一题都是修炼!

qq_56086076的博客 639

Leetcode-“二分查找”-爱吃香蕉的珂珂

Leetcode-"二分查找”-爱吃香蕉的珂珂 描述:珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。 珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。 珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。 返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。 示例 1: 输入: piles

weixin_46443427的博客 498

LeetCode总结

终于把LeetCode免费题目都做完了,接下来要做第二遍,想把第一遍不会做的题目整理一下思路,为接下来的google面试准备一下,万一过了呢,哈哈。315 Count of Smaller Numbers After Self 题意:计算每个元素右面有多少个元素小于它 从后向前遍历,维护一个排好序的数组,每次插入新元素时确定其在有序数组的位置,就是要求的右面有多少个元素小

monkeyduck的专栏 1595

力扣每日一题(五十二——数组的三角和)

仅以此纪录每日LeetCode所刷题目。 题目描述: 示例: 思路: 这道题通过观察我们可以发现,如果有n个数,那么在(n-1)次变换之后即可得到答案,而在每次变换的时候,每一行的最后一个数都会消失,因此我们这道题可以进行双for循环模拟,注意总和大于十要mod10取余。 代码: class Solution: def triangularSum(self, nums: List[int]) -> int: if len(nums) == 1: ..

touxing777的博客 2069
上一篇: Cartographer学习记录:手把手教你如何获取3D SLAM后端的位姿
下一篇: 优先队列(priority_queue)的妙用(以力扣周赛“K 次增加后的最大乘积”为例)
不甘平凡的平凡之人
博客等级 码龄6年 26粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值