0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

贪心算法:分发饼干

算法与数据结构 来源:代码随想录 作者:代码随想录 2022-06-06 09:25 次阅读

贪心的第一道题目,快看看你够不够贪心

455.分发饼干

力扣题目链接:https://leetcode-cn.com/problems/assign-cookies

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j]。如果 s[j]>= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

示例1:

  • 输入: g = [1,2,3], s = [1,1]
  • 输出: 1 解释:你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。所以你应该输出1。

示例2:

  • 输入: g = [1,2], s = [1,2,3]
  • 输出: 2
  • 解释:你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。你拥有的饼干数量和尺寸都足以让所有孩子满足。所以你应该输出2.

提示:

  • 1 <= g.length <= 3 * 10^4
  • 0 <= s.length <= 3 * 10^4
  • 1 <= g[i], s[j] <= 2^31 - 1

思路

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

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

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

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

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

如图:

3d55a436-e537-11ec-ba43-dac502259ad0.png455.分发饼干

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

C++代码整体如下:

//时间复杂度:O(nlogn)
//空间复杂度:O(1)
classSolution{
public:
intfindContentChildren(vector<int>&g,vector<int>&s){
sort(g.begin(),g.end());
sort(s.begin(),s.end());
intindex=s.size()-1;//饼干数组的下表
intresult=0;
for(inti=g.size()-1;i>=0;i--){
if(index>=0&&s[index]>=g[i]){
result++;
index--;
}
}
returnresult;
}
};

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

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

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

代码如下:

classSolution{
public:
intfindContentChildren(vector<int>&g,vector<int>&s){
sort(g.begin(),g.end());
sort(s.begin(),s.end());
intindex=0;
for(inti=0;i< s.size();++i){
            if(index< g.size() && g[index] <= s[i]){
                index++;
            }
        }
        returnindex;
}
};

总结

这道题是贪心很好的一道入门题目,思路还是比较容易想到的。

文中详细介绍了思考的过程,想清楚局部最优,想清楚全局最优,感觉局部最优是可以推出全局最优,并想不出反例,那么就试一试贪心

其他语言版本

Java

classSolution{
//思路1:优先考虑饼干,小饼干先喂饱小胃口
publicintfindContentChildren(int[]g,int[]s){
Arrays.sort(g);
Arrays.sort(s);
intstart=0;
intcount=0;
for(inti=0;i< s.length && start < g.length; i++) {
            if(s[i]>=g[start]){
start++;
count++;
}
}
returncount;
}
}
classSolution{
//思路2:优先考虑胃口,先喂饱大胃口
publicintfindContentChildren(int[]g,int[]s){
Arrays.sort(g);
Arrays.sort(s);
intcount=0;
intstart=s.length-1;
//遍历胃口
for(intindex=g.length-1;index>=0;index--){
if(start>=0&&g[index]<= s[start]) {
                start--;
                count++;
            }
        }
        returncount;
}
}

Python

class Solution:
    # 思路1:优先考虑胃饼干
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()
        s.sort()
        res = 0
        for i in range(len(s)):
            if res = g[res]:  #小饼干先喂饱小胃口
                res += 1
        return res
classSolution:
#思路2:优先考虑胃口
deffindContentChildren(self,g:List[int],s:List[int])->int:
g.sort()
s.sort()
start,count=len(s)-1,0
forindexinrange(len(g)-1,-1,-1):#先喂饱大胃口
ifstart>=0andg[index]<= s[start]:
                start -= 1
count+=1
returncount

Go

//排序后,局部最优
funcfindContentChildren(g[]int,s[]int)int{
sort.Ints(g)
sort.Ints(s)

//从小到大
child:=0
forsIdx:=0;child< len(g)&&sIdx< len(s);sIdx++{
ifs[sIdx]>=g[child]{//如果饼干的大小大于或等于孩子的为空则给与,否则不给予,继续寻找选一个饼干是否符合
child++
}
}

returnchild
}

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4601

    浏览量

    92649
  • 数组
    +关注

    关注

    1

    文章

    416

    浏览量

    25910

原文标题:分发饼干,也要贪心

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【「从算法到电路—数字芯片算法的电路实现」阅读体验】+内容简介

    内容简介这是一本深入解读基础算法及其电路设计,以打通算法研发到数字IC设计的实现屏障,以及指导芯片设计工程师从底层掌握复杂电路设计与优化方法为目标的专业技术书。任何芯片(如WiFi芯片、5G芯片
    发表于 11-21 17:14

    【「从算法到电路—数字芯片算法的电路实现」阅读体验】+介绍基础硬件算法模块

    作为嵌入式开发者往往比较关注硬件和软件的协调。本书介绍了除法器,信号发生器,滤波器,分频器等基本算法的电路实现,虽然都是基础内容,但是也是最常用到的基本模块。 随着逆全球化趋势的出现,过去的研发
    发表于 11-21 17:05

    OPPO应用分发的燎原之火,照亮开发者的增长之路

    全面赋能应用分发,“火炬手”OPPO闯出一条增长之路
    的头像 发表于 10-18 13:34 1304次阅读
    OPPO应用<b class='flag-5'>分发</b>的燎原之火,照亮开发者的增长之路

    华纳云:如何理解内容分发网络(CDN)

    分发网络(CDN)是一种网络架构,旨在提高用户对网站、应用程序或其他互联网内容的访问速度和性能。CDN 的主要原理是通过在全球范围内部署分布式服务器,将内容缓存并提供给用户距离Z近的服务器,从而减少加载时间、提高可用性和降低网络延迟。
    的头像 发表于 09-27 16:26 191次阅读

    RobustRIO-E模块 时钟同步&分发,实现声音与振动板卡间及跨机箱时钟同步

    同步时钟发生器 + 同步时钟分发
    的头像 发表于 09-14 15:00 241次阅读
    RobustRIO-E模块 时钟同步&<b class='flag-5'>分发</b>,实现声音与振动板卡间及跨机箱时钟同步

    使用 BQ25180 线性充电器充分发挥NTC的全部潜力

    电子发烧友网站提供《使用 BQ25180 线性充电器充分发挥NTC的全部潜力.pdf》资料免费下载
    发表于 09-09 09:32 0次下载
    使用 BQ25180 线性充电器充<b class='flag-5'>分发</b>挥NTC的全部潜力

    深度学习的基本原理与核心算法

    处理、语音识别等领域取得了革命性的突破。本文将详细阐述深度学习的原理、核心算法以及实现方式,并通过一个具体的代码实例进行说明。
    的头像 发表于 07-04 11:44 1691次阅读

    神经网络反向传播算法的优缺点有哪些

    是一种模拟人脑神经元网络的计算模型,具有强大的非线性映射能力和泛化能力。反向传播算法是训练神经网络的核心算法,通过梯度下降法优化网络权重,使网络输出尽可能接近目标值。然而,反向传播算法也存在一些局限性和问题,需要在实际应用中加以
    的头像 发表于 07-03 11:24 686次阅读

    构建鸿蒙生态服务分发新体验,鸿蒙元服务助力伙伴服务创新

    6月22日,华为开发者大会(HDC 2024)元服务服务分发分论坛现场 当前,鸿蒙生态伙伴正在同步开发元服务,包括新华社、网上国网、南方航空、广发银行、奈雪的茶、肯德基、同程旅行、捷停车等,作为
    的头像 发表于 06-24 14:55 393次阅读

    AI智算中心算力服务商探索智造完成A轮融资

    近日,领先的AI智算中心算力服务商探索智造宣布成功完成A轮融资。本轮融资由无锡云林产业发展投资基金领投,旨在为公司提供强大的资金支持,助力其业务的进一步拓展和升级。
    的头像 发表于 05-30 09:33 418次阅读

    机器学习六大核心算法深度解析

    算法历程:线性回归是一种古老的统计方法,它试图找到最佳拟合数据的直线或超平面,最早可以追溯到19世纪初的高斯最小二乘法理论。
    发表于 04-23 16:25 1635次阅读
    机器学习六大核<b class='flag-5'>心算法</b>深度解析

    基于门控线性网络(GLN)的高压缩比无损医学图像压缩算法

    实现基于门控线性网络(GLN)的高压缩比无损医学图像压缩算法,以提高医学图像存储和分发系统的效率。与“传统”的基于上下文的数据压缩算法相比,基于GLN的系统使用一组不同的上下文模型。
    的头像 发表于 04-08 10:29 616次阅读
    基于门控线性网络(GLN)的高压缩比无损医学图像压缩<b class='flag-5'>算法</b>

    陀螺仪芯片+传感器定制

    本人想开发一套摔倒瞬间的触发系统,目前缺主程序核心算法。有懂的大神求指教
    发表于 03-21 10:36

    长沙超算中心算力重归国际一流水平 同时湖南公布2024年十大产业项目

    长沙超算中心算力重归国际一流水平 同时湖南公布2024年十大产业项目 长沙积极打造成全球研发中心城市;长沙产业发展迅速,已经形成新一代自主安全计算系统国家级先进制造业集群。 据湖南省政府工作报告数据
    的头像 发表于 01-25 16:04 2012次阅读

    电池管理系统(BMS)基本功能

    BMS 核心算法 基于Kalman滤波的闭环SOC估计策略,提高SOC估计精度 基于模型的容量、内阻在线辨识,监控电池老化状态(SOH) 考虑工况变化的剩余能量(SOE)估计,保障整车续驶里程估计精度
    的头像 发表于 12-07 11:15 1640次阅读
    电池管理系统(BMS)基本功能