vlambda博客
学习文章列表

【算法】 用贪心算法来分饼干

hi,这里是一个新的算法板块,在「每类」算法的「第一个」例题中,我们会简单介绍算法内容。之后「同类」算法题目将不再介绍算法简介。算法均由 js 实现。

贪心算法简介

顾名思义,贪心算法采取“贪心”策略,即:保证每次局部都为最优解,从而使最后得到的结果为全局最优解。

题目描述

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/assign-cookies

示例

输入: g = [1,2], s = [1,2,3]
输出: 2
解释: 可以给两个孩子吃[1,2], [1,3], [2, 3] 这三种组合的的任意一种,每个孩子都能吃饱,则输出为 2。

题目详解

根据贪心算法,优先喂「饥饿度最小」的孩子,且尽量使剩下的饼干「满足饥饿度更大」的孩子。贪心策略即为:「给剩余小孩中饥饿度最小的孩子能饱腹的最少饼干」。

因此「符合贪心策略的便捷实践为」:分别按照从小到大的顺序给饥饿度与饼干尺寸排序,这样便可以从饥饿度最小的孩子和尺寸最小的饼干开始计算。

算法实现

var findContentChildren = (g, s) => {
  if (!g || !s){
    return 0
  }
  
  g = g.sort((a,b) => a - b)
  s = s.sort((a,b) => a - b)
  
  let child = 0
  let cookie = 0
  const childrenLen = g.length
  const cookiesLen = s.length
  
  while(child < childrenLen &&
    cookie < cookiesLen) {
    if (g[child] <= s[cookie]) {
      ++child
    }
    ++cookie
  }
  return child
}