本题用二分查找的方式来找糖果数量。
查找的区间:[0, 糖果总和]
判断当前数量是否满足条件:在糖果数组中计算能够分配的孩子数量,如果大于 k
说明这个数量是可行的,遍历一遍数组,时间复杂度为O(N)
。
二分查找的复杂度为O(logN)
,所以总时间复杂度为O(N*logN)
。
—————————————————————————————————————
二分查找的模板:
- 循环条件:
l < r
(当l == r
时终止) - 中间值计算:
mid = (l+r)/2
或者mid = ceil( (l+r)/2 )
- 边界更新:按照题目需要,两种情况:
- 【
l = mid
,r = mid-1
】或【l = mid+1
,r = mid
】 - 【注:
mid
始终被分配到其中一边,如果左移不包括,右移就要包括,反之亦然】
———————————————————————————————————
这些参数如何组合呢?简单的判断方法:
- 假想
l
和r
相邻,比如3
和4
,分别假设两边为解时,是否会构成死循环,来选取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);
}
};