(因为自己的基础实在太薄弱了,所以打算每天在leetCode上刷几道题来弥补基础知识)
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.
初始化孩子数组g,饼干数组s,结果返回数值变量num
很久没做算法题,思维已经变得很僵化了。
第一次思路: 让饼干尺寸对应孩子胃口。对于第一个饼干尺寸遍历孩子数组,假如该饼干尺寸满足某孩子胃口,则将该孩子胃口变成无限大(相当于以后饼干的分配会忽略掉该孩子),num++,然后跳出遍历的循环进入下一个饼干的判定,直到所有饼干都判定过了,返回num。
结果:错误,因为这个思路忽视了最优化,比如g=[1,2,3],s=[5,2,1],那么根据这个思路第一个饼干5会分配给胃口1的孩子,这显然不是最优解。最优情况应该是让尺寸5的饼干分配给胃口3的孩子。
第二次思路:每块饼干遍历所有的孩子,找出饼干尺寸和胃口最小的差值(大于0),然后依此分配。(企图达到最优化)
结果:超时(emmmm)。这种思路时间复杂度相当于O(m*n),耗时有点大……
第三次思路:先用快排从小到大排序g和s,然后再进行第一次思路的算法……(快排算法参照的是阮一峰老师的快排,但是看一大堆人说这是错误的方法……暂时不懂)
结果:总算成功了……
代码:
/**
* @param {number[]} g
* @param {number[]} s
* @return {number}
*/
var findContentChildren = function(g, s) {
var num=0;
var max=Number.POSITIVE_INFINITY;
g=quicksort(g);
s=quicksort(s);
for(var i in s){
for(var j in g){
if(s[i]>=g[j]){
g[j]=max;
num++;
break;
}
}
}
return num;
};
function quicksort(arr){
if(arr.length<=1){
return arr;
}
var pIndex=Math.floor(arr.length/2);
var p=arr.splice(pIndex,1)[0];
var left=[];
var right=[];
for(var i in arr){
if(arr[i]<=p){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
return quicksort(left).concat([p],quicksort(right));
}

整道题用时差不多1个小时吧orz

博主分享了在leetcode上刷题的过程,专注于455题——分发饼干,旨在提升基础。题目要求找到能最大化满足孩子胃口的饼干分配方案。博主经历了三次尝试:首次尝试忽略了最优化,第二次尝试因时间复杂度过高导致超时,最终通过快速排序优化实现了正确解法。
619

被折叠的 条评论
为什么被折叠?



