题目
给你一个 下标从 0 开始 的整数数组 candies 。数组中的每个元素表示大小为 candies[i] 的一堆糖果。你可以将每堆糖果分成任意数量的 子堆 ,但 无法 再将两堆合并到一起。
另给你一个整数 k 。你需要将这些糖果分配给 k 个小孩,使每个小孩分到 相同 数量的糖果。每个小孩可以拿走 至多一堆 糖果,有些糖果可能会不被分配。
返回每个小孩可以拿走的 最大糖果数目 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-candies-allocated-to-k-children
思路
二分算法
mid符合条件时,我们会希望得到更大的答案,此时查找区间从[left, right]变为[mid + 1, right],同时对ans进行更新
mid不符合条件,则答案过大,我们希望得到符合条件的答案,因此要对右区间进行缩小,此时查找区间从[left, right]变为[left, mid - 1]
使用暴力算法,我们需要枚举每一堆的数目从1到最大的candies[i]
使用二分查找,查找中间值,如果中间大小的可以,那么l=mid+1
如果中间值不可以,那么r=mid-1
代码
class Solution {
public:
int maximumCandies(vector<int>& candies, long long k) {
int l=1;
int r=*max_element(candies.begin(),candies.end());
long long count=0;
int ans=0;
while(l<=r){
count=0;
int mid=l+(r-l)/2;
for(int ele:candies){
count+=ele/mid;
}
if(count>=k){
l=mid+1;
ans=mid;
}
else
r=mid-1;
}
return ans;
}
};