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

    文章

    4587

    浏览量

    92478
  • 数组
    +关注

    关注

    1

    文章

    412

    浏览量

    25880

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

    同步时钟发生器 + 同步时钟分发
    的头像 发表于 09-14 15:00 221次阅读
    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 1504次阅读

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

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

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

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

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

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

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

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

    陀螺仪芯片+传感器定制

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

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

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

    鸿蒙原生应用/元服务开发-AGC分发如何上架HarmonyOS应用

    ”下拉框仅筛选出HarmonyOS应用,或点击“支持设备”按设备类型筛选查找。 3.点击待发布的HarmonyOS应用名称,在左侧导航栏选择“应用信息”菜单。 4.如果开发者尚未签署华为智慧分发平台
    发表于 11-24 14:44

    Andriod中VSync的分发

    App与SurfaceFlinger是不同的进程,它们之间传递VSync的话涉及到进程间通信,而且VSync频率很高,App很多,所以VSync的分发效率要很高才行。Linux进程间通信方式总共
    的头像 发表于 11-21 16:32 766次阅读
    Andriod中VSync的<b class='flag-5'>分发</b>

    完美时序-时钟产生和分发设计指南

    电子发烧友网站提供《完美时序-时钟产生和分发设计指南.pdf》资料免费下载
    发表于 11-18 10:27 0次下载
    完美时序-时钟产生和<b class='flag-5'>分发</b>设计指南

    鸿蒙原生应用开发-元服务分发方式的调整及趋势

    元服务上架审核通过后,会收到邮件通知,但此时还无法搜索到上架的元服务,需要华为进行配置后,才能让元服务露出。当前,元服务分发的主要渠道有: 1.应用市场:具备搜索能力,在搜索结果的“服务”页签露出
    发表于 11-14 16:02

    华测导航:不断优化核心算法,同时布局车规级芯片

    华测导航推出的新一代cgi-430高精密惯性导航系统以系统全体频率的gnss基础卡和6轴战术级imu为基础,使用中国领航员的新一代贴合算法引擎,结合gnss、ins、dr信息进行计算。
    的头像 发表于 11-14 14:34 1211次阅读