Skip to content

Latest commit

 

History

History
69 lines (53 loc) · 3.22 KB

455-AssignCookies.md

File metadata and controls

69 lines (53 loc) · 3.22 KB

分发饼干

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值  gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

注意:

你可以假设胃口值为正。 一个小朋友最多只能拥有一块饼干。

示例  1:

输入: [1,2,3], [1,1]

输出: 1

解释:
你有三个孩子和两块小饼干,3 个孩子的胃口值分别是:1,2,3
虽然你有两块小饼干,由于他们的尺寸都是 1,你只能让胃口值是 1 的孩子满足。
所以你应该输出 1

示例  2:

输入: [1,2], [1,2,3]

输出: 2

解释:
你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出2.

思路:

对于这道题,目标是尽可能满足更多孩子的胃口。贪心算法是一个合适的思路,因为要优先用较小尺寸的饼干去满足较小胃口的孩子,这样能最大程度地满足更多孩子。通过对孩子的胃口值数组和饼干尺寸数组进行排序,然后依次比较,符合条件就分配饼干给孩子,这种方法能够有效地找到最多能满足的孩子数量。

  1. 首先初始化两个变量 child 和 cookie,分别用于记录已满足的孩子数量和已使用的饼干数量,初始值都为 0。
  2. 对孩子的胃口值数组 g 和饼干尺寸数组 s 分别进行升序排序,这样便于后续的贪心操作。
  3. 进入 while 循环,只要还有孩子没考虑(child < g.length)并且还有饼干没考虑(cookie < s.length),就继续循环:
    • 比较当前孩子的胃口值 g[child]和当前饼干的尺寸 s[cookie],如果当前饼干尺寸大于等于当前孩子的胃口值,说明这块饼干可以满足这个孩子,将 child 加 1,表示又有一个孩子得到满足。
    • 无论是否满足了孩子,都将 cookie 加 1,考虑下一块饼干。因为即使这块饼干不能满足当前孩子,也需要尝试下一块饼干是否能满足。
  4. 最后返回 child,即能满足的孩子的最大数量。

时间复杂度:对两个数组进行排序,时间复杂度通常为 O(n log n)和 O(m log m),其中 n 是 g 数组的长度,m 是 s 数组的长度。在最坏情况下,需要遍历两个数组中的较小长度的数组,这部分时间复杂度为 O(min(n, m))。综合起来,总的时间复杂度为 O(max(n log n, m log m))。 空间复杂度:除了输入的数组外,只使用了几个常数级别的变量,空间复杂度为 O(1)。

/**
 * @param {number[]} g
 * @param {number[]} s
 * @return {number}
 */
var findContentChildren = function (g, s) {
  let child = 0; // 孩子
  let cookie = 0; // 饼干
  g.sort((a, b) => a - b);
  s.sort((a, b) => a - b);
  while (child < g.length && cookie < s.length) {
    if (g[child] <= s[cookie]) {
      child++;
    }
    cookie++;
  }
  return child;
};