【算法31天:Day31】第八章贪心算法 LeetCode 分发饼干(455)

67 阅读1分钟

题目一:

image.png

为了满足更多的小孩,就不要造成饼干尺寸的浪费。

大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。

这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩

可以尝试使用贪心策略,先将饼干数组和小孩数组排序。

然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。

如图:

455.分发饼干

这个例子可以看出饼干9只有喂给胃口为7的小孩,这样才是整体最优解,并想不出反例,那么就可以撸代码了。

var findContentChildren = function(g, s) {
    // g[i] 胃口值 s[j]饼干尺寸
    g.sort((a, b) => a - b)
    s.sort((a, b) => a - b)
    let index = s.length - 1 // 饼干数组的下标
    let result = 0
    for (let i = g.length - 1; i >= 0; i--) {
        if (i >= 0 && s[index] >= g[i]) {
            result++
            index--
        }
    }
    return result
};

从代码中可以看出用了一个index来控制饼干数组的遍历,遍历饼干并没有再起一个for循环,而是采用自减的方式,这也是常用的技巧。

有的同学看到要遍历两个数组,就想到用两个for循环,那样逻辑其实就复杂了。

也可以换一个思路,小饼干先喂饱小胃口

var findContentChildren = function(g, s) {
    // g[i] 胃口值 s[j]饼干尺寸
    g.sort((a, b) => a - b)
    s.sort((a, b) => a - b)
    let index = 0
    for (let i = 0; i < s.length; i++) {
        if (index < g.length && g[index] <= s[i]) {
            index++
        }
    }
    return index
};