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

    文章

    4760

    浏览量

    97146
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27114

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    芯片专家精准赋能:超声切割技术迎来核心算法突破新契机

    算法与硬件平台的协同挑战在技术对接过程中,固特超声技术总监坦言面临的三大技术难题:"虽然我们已构建基于DSP或FPGA的全数字控制平台,实现了超声电源系统的数字
    的头像 发表于 11-11 18:18 620次阅读
    芯片专家精准赋能:超声切割技术迎来核<b class='flag-5'>心算法</b>突破新契机

    SM4算法实现分享(一)算法原理

    SM4分组加密算法采用的是非线性迭代结构,以字为单位进行加密、解密运算,每次迭代称为一轮变换,每轮变换包括S盒变换、非线性变换、线性变换、合成变换。加解密算法与密钥扩展都是采用32轮非线性迭代结构
    发表于 10-30 08:10

    Camellia算法的实现二(基于开源蜂鸟E203协处理器)

    115200波特率向FPGA发送数据或密钥数据,UART_RX模块接收到数据后,进行串并转换,并将转换后的数据传给Camellia的核心算法模块进行处理。经过处理后的数据,并进行并串转换后,通过UART_TX
    发表于 10-30 06:35

    国密系列算法简介及SM4算法原理介绍

    一、 国密系列算法简介 国家商用密码算法(简称国密/商密算法),是由我国国家密码管理局制定并公布的密码算法标准。其分类1所示: 图1 国家商用密码
    发表于 10-24 08:25

    加密算法的应用

    一些缺点。由于加密和解密使用同一个密钥,因此密钥的保密性必须得到保证。如果密钥泄露,那么攻击者就可以轻易地解密密文数据。此外,在对称加密算法中,密钥的分发也是一个难题,如何将密钥安全地传递给对方也需要
    发表于 10-24 08:03

    液态金属电阻率测试仪的核心算法与信号处理技术

    液态金属电阻率测试仪之所以能在科研与工业领域精准捕捉液态金属的电学特性,背后离不开核心算法与信号处理技术的协同支撑。这两大技术如同测试仪的“智慧大脑” 与 “敏锐感官”,前者负责将原始测量数据转化
    的头像 发表于 09-01 09:21 441次阅读
    液态金属电阻率测试仪的核<b class='flag-5'>心算法</b>与信号处理技术

    RIGOL示波器支持GHz级量子密钥分发测试

    一、引言 1.1量子密钥分发技术的重要性 在信息时代,数据安全至关重要。传统加密技术虽广泛应用,但存在被量子计算机破解的风险。量子密钥分发技术基于量子力学原理,能实现无条件安全的密钥传输。它使通信
    的头像 发表于 08-10 15:19 1048次阅读

    DFT算法与FFT算法的优劣分析

    一概述 在谐波分析仪中,我们常常提到的两个词语,就是DFT算法与FFT算法,那么一款功率分析仪/谐波分析仪采用DFT算法或者FFT算法,用户往往关注的是能否达到所要分析谐波次数的目的,
    的头像 发表于 08-04 09:30 894次阅读

    三坐标测量机路径规划与补偿技术:核心算法解析

    三坐标测量的微米级精度背后,是精密的路径规划算法与实时补偿技术在保驾护航。三坐标测量机的智能避撞算法保障了测量的安全与高效;温度补偿技术消除了环境的无形干扰;点云智能处理则让海量数据蜕变为精准的工程
    的头像 发表于 08-01 14:15 1312次阅读
    三坐标测量机路径规划与补偿技术:核<b class='flag-5'>心算法</b>解析

    shimetapi:开源RGB+EVS视觉融合相机事件相机工具链与算法

    的接口控制和算法处理。 一、shimetapi_Hybrid_vision_algo (算法层 SDK) 定位: 这是 SDK 的核心算法处理层,位于架构的中间层(黄色部分)。 核心功能: 专注于处理来自
    的头像 发表于 06-26 13:52 464次阅读

    RFID在药品分发中的应用

    。RFID在药品分发中的优势高效率:RFID可以快速批量读取药品信息,大幅缩短分发时间,提高药品管理效率。准确性:RFID减少了人工操作的错误率,提高了药品分发的准确
    的头像 发表于 04-17 18:11 463次阅读
    RFID在药品<b class='flag-5'>分发</b>中的应用

    永磁同步电机(PMSM)调速系统的智能控制算法研究

    为了解决PMSM 速度控制问题,文中提出了一种模糊自整定 PI的控制方案,并用 MATLAB 对系统 进行了建模仿真验证。仿真实验结果表明,该种新型控制算法与传统的PI 控制相比较,具有很强的适应性
    发表于 03-26 14:09

    Jtti.cc SCDN如何提高内容分发效率?

    安全内容分发网络(SCDN)是一种集成了安全防护功能的内容分发网络。它不仅能够加速内容的分发,还能有效抵御各种网络攻击,确保内容的安全传输。以下是 SCDN 提高内容分发效率的具体方法
    的头像 发表于 03-25 16:00 414次阅读

    C++学到什么程度可以找工作?

    、动态规划、贪心算法等)。 3. **操作系统原理**:理解进程与线程、并发控制、同步机制(如互斥锁、信号量等)、进程间通信等概念。 4. **网络编程**:熟悉基于Socket的网络编程,了解TCP
    发表于 03-13 10:19

    华为OpenLab助力打造行业AI解决方案

    昇腾在业界首先完成了DeepSeek核心算法适配,支持DeepSeek全系模型预训练及微调,昇腾生态最优、适配最好、模型架构最亲和,是DeepSeek算力“最优解 "。
    的头像 发表于 02-19 10:35 915次阅读
    华为OpenLab助力打造行业AI解决方案