描述
给你一个 下标从 0 开始 的整数数组 candies 。数组中的每个元素表示大小为 candies[i] 的一堆糖果。你可以将每堆糖果分成任意数量的 子堆 ,但 无法 再将两堆合并到一起。
另给你一个整数 k 。你需要将这些糖果分配给 k 个小孩,使每个小孩分到 相同 数量的糖果。每个小孩可以拿走 至多一堆 糖果,有些糖果可能会不被分配。
返回每个小孩可以拿走的 最大糖果数目 。
分析
- 二分查找选出合适的糖果数量
- 二分在左右相遇时仍然循环,每个符合的mid都要更新保存一下,因为不论mid是否符合左右指针都会移动,不保存会丢失目标解。
- 在计算按mid分堆是否能够达到k时,注意累加的变量要使用long
class Solution {
public int maximumCandies(int[] candies, long k) {
Arrays.sort(candies);
int left =1, right = candies[candies.length - 1];
int ans = 0;
while(left <= right){
int mid = (right - left) / 2 + left;
if(judge(k,mid,candies)){
left = mid + 1;
ans = mid;
}else{
right = mid - 1;
}
}
return ans;
}
public boolean judge(long k, int mid, int[] nums){
long sum = 0;
for(int i = nums.length - 1; i >= 0; i--){
if(nums[i] < mid){
continue;
}
sum += nums[i] / mid;
if(sum >= k){
return true;
}
}
return sum >= k;
}
}