分发饼干[455]

分发饼干[455]

  • 题目
  • 解法一
  • 解法二

题目

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 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.
 Related Topics 贪心算法
 181  0

解法一

//leetcode submit region begin(Prohibit modification and deletion)
/**
 * @param {number[]} g
 * @param {number[]} s
 * @return {number}
 */
var findContentChildren = function (g, s) {
    // 存储每个孩子拿到的饼干值的下标
    let _g = []
    for (let i = 0; i < g.length; i++) {
        // 默认为没有拿到饼干
        _g[i] = -1;
        // 每个孩子都去挑一块最适合他的饼干,挑完饼干之后,这块饼干不能被其他孩子挑选
        for (let j = 0; j < s.length; j++) {
            // 如果这块饼干是否适合这个孩子
            if (s[j] >= g[i]) {
                if (_g[i] == -1) {
                    // 把这块饼干给这个孩子
                    _g[i] = j
                } else if (s[j] < s[_g[i]]) {
                    // 比较下孩子手上这块饼干是否是最合适的
                    _g[i] = j
                }
            }
        }
        // 如果拿到了最合适的,这块饼干不能被其他孩子挑选
        if (_g[i] != -1) {
            s[_g[i]] = -1
        }
    }
    return _g.filter(i => i > -1).length
}
//leetcode submit region end(Prohibit modification and deletion)

缺点: 消耗时间太长
分发饼干[455]_第1张图片

解法二

var findContentChildren = function (g, s) {
    // 存储每个孩子拿到的饼干值的下标
    let cnt = 0;
    // 先按低到高排队来取饼干,每个人只能取面前的一块饼干
    g = g.sort((a, b) => b - a)
    // 把饼干按大小从小到大依次铺开,
    s = s.sort((a, b) => b - a)
    for (let i = 0; i < g.length; i++) {
        if (s[0] >= g[i]) {
            cnt++;
            s.shift()
        }
    }
    return cnt
}

分发饼干[455]_第2张图片

你可能感兴趣的:(贪心算法,LeetCode)