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

LC2226.每个小孩最多能分到多少糖果
image.png

思路:二分查找取代暴力遍历

  • 一堆糖果只能拆,不能合并,那么只要逐个堆计算,当前堆可以满足多少个小孩是非常容易计算的,最后相加就行。
  • 如果每个小孩对糖果的需求量很少,比如1人就要1个,那么可以满足的人数就越多。越是要的多,满足的人就越少。
  • 逐个增加小孩对糖果的需求,直到恰好满足 k个小孩。
  • 对于“每个小孩需要的糖果数量”这个区间而言,相当于取左边区间的右端点。(二分查找)

    代码:

    1. class Solution {
    2. public:
    3. bool check(int per_candy, vector<int>& candies, long long k) {
    4. long long cnt = 0;
    5. for (int i = 0; i < candies.size(); i++) {
    6. cnt += (candies[i] / per_candy);
    7. }
    8. return cnt >= k;
    9. }
    10. int maximumCandies(vector<int>& candies, long long k) {
    11. // 小孩拿到的糖果越是少,越是容易满足
    12. // 逐步提升小孩拿到的糖果数量,直到恰好满足 k 个小孩为止
    13. // 对于"每个小孩可以获得的糖果数量"这个数组而言,相当于取左区间的右端点
    14. int n = candies.size();
    15. int left = 0, right = *max_element(candies.begin(), candies.end());
    16. while (left < right) {
    17. int mid = (left + right + 1) / 2;
    18. if (check(mid, candies, k)) {
    19. left = mid;
    20. } else {
    21. right = mid - 1;
    22. }
    23. }
    24. return right;
    25. }
    26. };