leetcode刷题记录:饼干问题

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(因为自己的基础实在太薄弱了,所以打算每天在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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值