Leetcode 每个小孩最多能分到多少糖果

在这里插入图片描述
本题用二分查找的方式来找糖果数量。
查找的区间:[0, 糖果总和]
判断当前数量是否满足条件:在糖果数组中计算能够分配的孩子数量,如果大于 k 说明这个数量是可行的,遍历一遍数组,时间复杂度为O(N)
二分查找的复杂度为O(logN),所以总时间复杂度为O(N*logN)
—————————————————————————————————————
二分查找的模板:

  • 循环条件:l < r(当l == r 时终止)
  • 中间值计算:mid = (l+r)/2 或者 mid = ceil( (l+r)/2 )
  • 边界更新:按照题目需要,两种情况:
  • l = midr = mid-1】或【l = mid+1r = mid
  • 【注:mid始终被分配到其中一边,如果左移不包括,右移就要包括,反之亦然】

———————————————————————————————————
这些参数如何组合呢?简单的判断方法:

  • 假想lr相邻,比如34,分别假设两边为解时,是否会构成死循环,来选取mid的生成方式

附上代码:

typedef long long ll;
class Solution {
public:
    int maximumCandies(vector<int>& candies, long long k) {
        ll total = 0;
        for(auto x : candies) total += x;
        ll l = 0, r = total;
        
        while(l < r){
            ll mid = ceil((l + r)/2.0);
            ll temp = 0;
            for(auto x : candies){
                temp += x/mid;
            }
            if(temp >= k)
                l = mid;
            else 
                r = mid-1;
        }
        return int(l);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值