返回

LeetCode题解:455. 分发饼干,贪心for循环,JavaScript,详细注释

前端

如何在LeetCode上解决分发饼干问题

前言

LeetCode是一个广受欢迎的在线编程平台,它提供了大量的算法和数据结构题目来测试和提高程序员的技能。其中一道题是“分发饼干”,要求我们根据给定的饼干大小和孩子胃口数组,合理分配饼干以满足尽可能多的孩子。本文将深入剖析这道题的题意、解题思路和JavaScript实现,并提供详细的代码注释和示例,帮助你轻松理解并掌握这道题目的解法。

题目

给定一个数组cookies,其中cookies[i]是第i个饼干的大小,以及一个数组children,其中children[i]是第i个孩子胃口的最小值。假设所有饼干都被一个无穷大的容器盛放,您必须按照如下规则分配饼干:

  1. 每位孩子只能得到一个饼干。
  2. 每位孩子只能得到满足其胃口的饼干,即仅当饼干大小大于或等于胃口大小时,这位孩子才能得到这份饼干。
  3. 当存在多种可行的分配方案时,您必须分配尽可能多的饼干。

解题思路

这道题的解法可以采用贪心算法,贪心算法是一种在每一步做出对当前情况来说最优选择的方法,从而得到全局最优解。具体步骤如下:

  1. 排序数组 :首先,我们将饼干数组和孩子数组分别按照从小到大的顺序进行排序。这样,我们可以轻松地为每个孩子分配最小的满足其胃口的饼干。
  2. 贪心分配 :接下来,我们使用两个指针childIndexcookieIndex来遍历两个排序后的数组。当cookieIndex指向的饼干大小大于或等于childIndex指向的孩子胃口时,我们就将这个饼干分配给这个孩子,并更新childIndexcookieIndex
  3. 统计满足孩子 :我们不断重复步骤2,直到所有孩子都得到饼干或饼干已经分配完毕。最后,我们统计满足孩子胃口的孩子的数量,作为问题的解。

JavaScript实现

/**
 * 分发饼干
 *
 * @param {number[]} cookies 饼干大小数组
 * @param {number[]} children 孩子胃口数组
 * @return {number} 最多可以满足的孩子数量
 */
const distributeCookies = (cookies, children) => {
  // 按照胃口大小从小到大排序孩子数组
  children.sort((a, b) => a - b);

  // 按照饼干大小从小到大排序饼干数组
  cookies.sort((a, b) => a - b);

  // 分配饼干
  let count = 0;
  let childIndex = 0;
  for (const cookie of cookies) {
    if (cookie >= children[childIndex]) {
      count++;
      childIndex++;
    }
    // 如果满足所有孩子的胃口,提前结束循环
    if (childIndex === children.length) {
      break;
    }
  }

  return count;
};

示例

为了更好地理解代码的运行过程,我们来看几个示例:

console.log(distributeCookies([1, 2, 3], [1, 1])); // 1
console.log(distributeCookies([2, 5, 6], [1, 2, 3])); // 2
console.log(distributeCookies([10, 10, 10], [1, 2, 3])); // 3
console.log(distributeCookies([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])); // 5

在第一个示例中,饼干大小[1, 2, 3]正好可以满足孩子胃口[1, 1],因此可以满足1个孩子。

在第二个示例中,饼干大小[2, 5, 6]可以满足孩子胃口[1, 2, 3],其中5和6可以满足孩子胃口为3的孩子,因此可以满足2个孩子。

在第三个示例中,饼干大小[10, 10, 10]可以满足所有孩子的胃口,因此可以满足3个孩子。

在第四个示例中,饼干大小和孩子胃口一一对应,因此可以满足5个孩子。

复杂度分析

  • 时间复杂度 :排序两个数组的时间复杂度是O(nlogn),其中n是饼干和孩子的数量。分配饼干的过程是使用贪心算法,每个孩子只考虑一次,因此时间复杂度是O(n). 因此,算法的总时间复杂度是O(nlogn + n),可以简化为O(nlogn).
  • 空间复杂度 :算法需要对饼干数组和孩子数组进行排序,因此需要额外的空间存储排序后的数组。因此,算法的空间复杂度是O(n).

常见问题解答

  1. 这道题的难点在哪里?
    这道题的难点在于如何高效地为每个孩子分配饼干,既要满足孩子胃口,又要满足尽可能多的孩子。贪心算法的引入解决了这个问题,它在每一步做出对当前情况来说最优的选择,从而得到全局最优解。

  2. 为什么我们先要对两个数组进行排序?
    对两个数组进行排序可以让我们轻松地找到满足每个孩子胃口的最小饼干,从而提高分配饼干的效率。

  3. 除了贪心算法,还有其他解决方法吗?
    其他解决方法包括动态规划和回溯法,但贪心算法通常是解决这道题的最快和最简单的方法。

  4. 这道题在实际生活中有什么应用?
    这道题可以应用于各种资源分配场景,例如在仓库管理中,如何将货物分配给不同客户以最大限度地满足客户需求。

  5. 如何进一步优化这道题的解法?
    可以使用二分查找来优化对孩子的胃口数组的搜索,从而进一步提高分配饼干的效率。

结论

通过本文的详细讲解,相信你已经掌握了如何使用贪心算法解决LeetCode上的“分发饼干”问题。这道题不仅考察了你的算法设计能力,也考验了你对贪心算法的理解和应用。通过不断练习和探索,相信你一定能够成为算法解题高手!