题目一:
为了满足更多的小孩,就不要造成饼干尺寸的浪费。
大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。
这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。
可以尝试使用贪心策略,先将饼干数组和小孩数组排序。
然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。
如图:
这个例子可以看出饼干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
};