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

    文章

    4454

    浏览量

    90747
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25593

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    陀螺仪芯片+传感器定制

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

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

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

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

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

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

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

    机器视觉检测解决方案:饼干尺寸检测

    对于现有饼干生产商来说,制作饼干的相关尺寸和管理过程仍存在着低效、高成本、难监管等问题,数字化的匮乏严重阻碍了关键数据的采集与分析,无法及时有效进行优化管理与决策,饼干制造厂的数智转型是解决这些
    的头像 发表于 10-11 09:55 179次阅读
    机器视觉检测解决方案:<b class='flag-5'>饼干</b>尺寸检测

    OpenHarmony应用分发运营体系

    一、分发流程 图片来源:OpenHarmony官网 二、主要途径 更多 开鸿智谷在鸿OS 开发板 设备 润和HiHopeOS开发板 设备 软通动力SwanLinkOS 开发板 设备 深开鸿
    发表于 09-21 15:27

    车辆导航系统中最优路径算法的研究

    组成部分,在当代科学技术充分发展的背景下产生,旨在将先进的计算机技术、通信技术、数据库技术、人工智能技术等运用于交通运输中,以解决交通拥挤、保证交通安全、提高交通网络使用效率等问题。最优路径的选择就是其中
    发表于 09-21 06:25

    沐曦携手富春云打造国产GPU华北核心算力节点

    近日,沐曦集成电路(上海)有限公司(以下简称“沐曦”)与浙江日报报业集团旗下北京富春云网络科技有限公司(以下简称“富春云”)在浙报数字文化科技园举行“沐曦富春云国产GPU华北核心算力节点项目”签约仪式,沐曦销售副总裁裘敏松、富春云总裁朱成永代表合作双方完成签约。
    的头像 发表于 09-20 14:16 797次阅读

    数据结构与算法贪心算法(2)#数据结构与算法

    算法函数数据结构
    未来加油dz
    发布于 :2023年09月13日 18:49:38

    数据结构与算法贪心算法(1)#数据结构与算法

    算法函数数据结构
    未来加油dz
    发布于 :2023年09月13日 18:48:32

    讲解消息分发的一种编译期实现法

    今天讲消息分发的一种编译期实现法。
    的头像 发表于 08-23 14:38 331次阅读

    全国产EtherCAT运动控制边缘控制器-ZMC432H

    ZMC432H,硬件核心器件全国产,软件核心算法自主自研自主可控。
    的头像 发表于 07-25 09:58 359次阅读
    全国产EtherCAT运动控制边缘控制器-ZMC432H

    Dijkstra算法和A*算法

    在本文中,我们将主要介绍Dijkstra算法和A*算法,从成本计算的角度出发,并逐步展开讨论。 我们将从广度优先搜索开始,然后引入Dijkstra算法,与贪心算法进行比较,最终得出A*
    的头像 发表于 07-07 10:56 620次阅读
    Dijkstra<b class='flag-5'>算法</b>和A*<b class='flag-5'>算法</b>

    分享一种路由重分发的标准解决方案

    路由重分发这一技术在现网环境中是一种很常见的技术,所以其地位也非常重要。很多教程在在讲路由重分发的时候,只讲了重分发的操作却没有说现网环境中的一些“讲究”。
    的头像 发表于 05-05 08:59 677次阅读
    分享一种路由重<b class='flag-5'>分发</b>的标准解决方案