数据结构与算法之贪心: LeetCode 455. 分饼干 (Ts, Py, Go版)

Leetcode——455.分发饼干——题解+代码实现 一、题目 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj。如果 sj>= gi,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 注意: 你可以假设胃口... 阅读详情

分发饼干

  • https://leetcode.cn/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 * 10410^4104
  • 0 <= s.length <= 3 * 10410^4104
  • 1 <= g[i], s[j] <= 2312^{31}231 - 1

Typescript 版算法实现


1 )排序 + 遍历

function findContentChildren(g: number[], s: number[]): number {
    // 升序排序两个数组
    g.sort((a, b) => a - b);
    s.sort((a, b) => a - b);
    let i: number = 0;
    // 遍历所有饼干尺寸
    s.forEach((item: number) => {
        // 饼干能满足当前孩子胃口,则接下来寻找下一个孩子
        if(item >= g[i]) ++i;
    });
    return i;
}
  • 解题思路
    • 局部最优:既能满足孩子,还消耗最少
    • 先将“较小的饼干”分给"胃口最小"的孩子
    • 既能满足孩子,还能消耗最小
  • 解题步骤
    • 对饼干数组和胃口数组升序排序
    • 遍历饼干数组,找到能满足第一个孩子的饼干
    • 然后继续遍历饼干数组,找到满足第二、三、…、n个孩子的饼干
  • 时间复杂度:O(nlogn)
    • 主要是sort
  • 空间复杂度 O(1)
    • 常量

2 )排序 + 双指针 + 贪心

function findContentChildren(g: number[], s: number[]): number {
    // 升序排序两个数组
    g.sort((a, b) => a - b);
    s.sort((a, b) => a - b);
    // 获取两个数组的长度
    const m: number = g.length, n: number = s.length;
    // 累计能满足孩子的数量
    let count: number = 0;
    for (let i: number = 0, j: number = 0; i < m && j < n; i++, j++) {
        // 找出所有饼干范围内 找出 符合 g[i] <= s[j] 的 j
        while (j < n && g[i] > s[j]) j++;
        // 当 j < n 时, 就记录一个满足条件的数额
        if (j < n) count++;
    }
    // 返回累计满足的数额
    return count;
};
  • 这是官方提供的思路
  • 为了尽可能满足最多数量的孩子,从贪心的角度考虑,应该按照孩子的胃口从小到大的顺序依次满足每个孩子
  • 且对于每个孩子,应该选择可以满足这个孩子的胃口且尺寸最小的饼干
  • 对于每个元素 g[i],找到未被使用的最小的 j 使得 g[i]≤s[j],则 s[j] 可以满足 g[i]
  • 由于 g 和 s 已经排好序,因此整个过程只需要对数组 g 和 s 各遍历一次
  • 当两个数组之一遍历结束时,说明所有的孩子都被分配到了饼干,或者所有的饼干都已经被分配或被尝试分配(可能有些饼干无法分配给任何孩子)
  • 此时被分配到饼干的孩子数量即为可以满足的最多数量
  • 时间复杂度:O(nlogn)
    • 严格计算是: O(mlog⁡m+nlog⁡n),其中 m 和 n 分别是数组 g 和 s 的长度
    • 对两个数组排序的时间复杂度是 O(mlog⁡m+nlog⁡n),遍历数组的时间复杂度是 O(m+n)
    • 因此总时间复杂度是 O(mlog⁡m + nlog⁡n)
  • 空间复杂度:O(logn)
    • 严格说来是: O(log⁡m+log⁡n)
    • 其中 m 和 n 分别是数组 g 和 s 的长度
    • 空间复杂度主要是排序的额外空间开销

Python3 版算法实现


1 ) 方案1

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        # 升序排序两个数组
        g.sort()
        s.sort()
        
        i = 0
        # 遍历所有饼干尺寸
        for item in s:
            # 饼干能满足当前孩子胃口,则接下来寻找下一个孩子
            if item >= g[i]:
                i += 1
            if i == len(g):
                break
        return i

2 ) 方案2

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        # 升序排序两个数组
        g.sort()
        s.sort()
        
        # 获取两个数组的长度
        m = len(g)
        n = len(s)
        
        # 累计能满足孩子的数量
        count = 0
        i, j = 0, 0
        while i < m and j < n:
            # 找出所有饼干范围内 找出 符合 g[i] <= s[j] 的 j
            while j < n and g[i] > s[j]:
                j += 1
            # 当 j < n 时, 就记录一个满足条件的数额
            if j < n:
                count += 1
                i += 1
                j += 1
            else:
                break
        # 返回累计满足的数额
        return count

Golang 版算法实现


1 ) 方案1

func findContentChildren(g []int, s []int) int {
	// 升序排序两个数组
	sort.Ints(g)
	sort.Ints(s)
	
	var i int = 0
	// 遍历所有饼干尺寸
	for _, item := range s {
		// 饼干能满足当前孩子胃口,则接下来寻找下一个孩子
		if item >= g[i] {
			i++
		}
		if i == len(g) {
			break
		}
	}
	return i
}

2 ) 方案2

func findContentChildren(g []int, s []int) int {
	// 升序排序两个数组
	sort.Ints(g)
	sort.Ints(s)
	
	// 获取两个数组的长度
	m := len(g)
	n := len(s)
	
	// 累计能满足孩子的数量
	count := 0
	for i, j := 0, 0; i < m && j < n; {
		// 找出所有饼干范围内 找出 符合 g[i] <= s[j] 的 j
		for j < n && g[i] > s[j] {
			j++
		}
		// 当 j < n 时, 就记录一个满足条件的数额
		if j < n {
			count++
			i++
			j++
		} else {
			break
		}
	}
	// 返回累计满足的数额
	return count
}
Qt Creator菜单栏消失的终极修复指南:从快捷键冲突到设置恢复 本文详细解析了Qt Creator菜单栏消失的常见原因及修复方法,包括快捷键冲突排查、配置文件重置和界面模式切换等解决方案。特别针对Qt开发者遇到的菜单栏显示问题,提供了从简单快捷键操作到深度配置修改的全方位指南,帮助用户快速恢复Qt Creator的正常使用。 阅读详情

相关推荐

DETR系列文章之–Co-DETR

Co-DETR,并行训练多个辅助头,以一对多的标签分配方式进行监督从辅助头中提取正样本坐标,为解码器中的正样本的训练效率进行额外的定制化正样本query.一对一标签分配:每个GT框分配给一个特定的query(DETR),较少的正query导致低效训练,从编码器生成的潜在表示和解码器中的注意力学习分析这一问题。一对多标签分配:每个GT框分配给检测器输出的多个proposal/anchor,依赖NMS或者anchor生成(ATSS,RetinaNet,FCOS,PAA)。

weixin_43731232的博客 2124

力扣-455. 分发饼干

欢迎关注笔者的微信公众号 455. 分发饼干 题目描述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子i,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 示例1: 输入: g = [1,2,3], s = [1,1] 输出: 1 解释:.

lymboy的博客 194

MS2107 CVBS转USB2.0 音视频采集芯片,支持1080P@30HZ输出

MS2107 是一款视频和音频采集芯片,支持CVBS转USB2.0 ;可以将 CVBS、S-Video 和音频信号通过 USB接口传送到 PC、智能手机和平板电脑上预览或采集。

TEL18967112838的博客 2076

leetcode 455. 分发饼干

这段代码是为LeetCode问题提供的两种解决方案。问题要求分配饼干给孩子,使尽可能多的孩子满足胃口。每个孩子都有一个胃口值,每个饼干都有一个尺寸值,饼干只能分给胃口值小于等于饼干尺寸的孩子。

m0_49013185的博客 764

图信号处理中的多尺度分析:图小波变换与图傅里叶变换的对比与应用

本文深入探讨了图信号处理中的多尺度分析方法,重点对比了图小波变换(GWT)与图傅里叶变换(GFT)的技术特点与应用场景。通过分析图的拓扑结构,GWT展现出强大的局部洞察力,适用于异常检测和社区发现;而GFT则擅长全局频率分析,适合趋势分析和信号去噪。文章结合实战案例,为读者提供了方法选型指南和前沿进展,帮助开发者在生物信息学、社交网络分析等领域高效应用这些技术。

weixin_30369041的博客 408

攻击时间控制的动态逆三维制导律(源代码)

%参考文献:《攻击时间控制的动态逆三维制导律》,哈尔滨工程大学学报,2010 %编程难点:视线坐标系与参考坐标系间的转换关系 一、采用本文方法结果 二、偏航通道采用增广比例导引律

算法小站 2393

贪心法——LeetCode Assign Cookies分饼干

贪心法 遵循某种规律,不断贪心的选取当前最优策略的算法设计方法 题目:LeedCode 455.Assign Cookies 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 你可以假设胃口值为

gl620321的博客 358

【WRF安装】WRF环境配置移植详细说明

【WRF安装】WRF环境配置移植详细说明

WW、forever的博客 820

LeetCode455. 分发饼干

题目描述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 注意: 你可以假设胃口值为正...

Miaoshuowen的博客 301

Python 神经计算实训 实训答案分享

【代码】Python 神经计算实训 实训答案分享。

2403_89314916的博客 352

【机器学习与数据挖掘实战 | 医疗】案例18:基于Apriori算法的中医证型关联规则分析

本案例针对三阴乳腺癌患者,经问卷调查收集数据并筛选处理形成原数据,经清洗、特征选择与变换后,构建Apriori模型,基于业务理解与建模结果,分析患者症状与中医证型关联,并据症状给出建议 。

Morse_Chen的博客 1385

LeetCode题练习与总结:分发饼干--455

本文详细介绍了如何使用贪心算法解决分配饼干问题,包括解题思路、具体代码实现、时间复杂度分析及知识点总结,旨在帮助读者掌握贪心算法在实际问题中的应用。

一直学习永不止步 1096

GPU 运维实战:H100/H800/B300 换卡与压测

(烧多久、看什么、什么算合格)。文末还给了一个能直接跑的验收判定脚本,三个真实场景的裁决输出都在。

老韩的Linux云计算架构师进阶之路 281

分发饼干

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj &gt;= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 注意: 你可以假设胃口值为正。 ...

长弓smile的博客 1215

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LeetCode 455. Assign Cookies 分饼干

Question:Assume you are an awesome parent and want to give your children some cookies. But, you should give each child at most one cookie. Each child i has a greed factor gi, which is the minimum size...

ConnieWu的博客 349

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

LeetCode——455分发饼干(贪心算法)

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj &gt;= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 注意: 你可以假设胃口值为正。 一个小...

kuaizi_sophia的博客 876

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Leetcode 455:分发饼干(最详细的解法!!!)

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj &gt;= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 注意: 你可以假设胃口值为正。 一个小...

coordinate的博客 2465

力扣Leetcode之Java解题455分发饼干

leetcode刷题之455分发饼干Java解题

小李子Lee 818

LeetCode 455. 分发饼干

题目 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 示例 1: 输入: g = [1,2,3], s = [1,1] 输出: 1 解释: 你有三个孩子和两块小饼干,3个孩子的胃口值分别是

午夜的行人 1473

leetcode455.分发饼干(简单)

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 示例 1: 输入: g = [1,2,3], s = [1,1] 思路:题目出现了 尽可能多,想到二分查找,返回L 代码如下: cla

zhangjiaji111的博客 570

贪心算法

贪心思想保证每次操作都是局部最优的,并且最后得到的结果是全局最优的。 分配饼干 455. Assign Cookies (Easy) Input: [1,2], [1,2,3] Output: 2 Explanation: You have 2 children and 3 cookies. The greed factors of 2 children are 1, 2. You ha...

Within的博客 508

LeetCode 分发饼干(贪心策略)

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 注意: 你可以假设胃口值为正。 一个小...

hestyle的博客 1184

【刷】leetcode之分配饼干问题

作者:Geekwyz 分配饼干

极客文化 264

leetcode饼干分配

(编程实现) 饼干分配 假设你是一位家长,你想要给你的孩子们一些饼干,你只能给一个孩子最多一块饼干. 每 个孩子 i 有一个贪婪因子 gi,gi 表示可以将这个满足孩子 i 的最小饼干尺寸. 每一块饼干 j 有各自的大小 sj,如果 sj ≥ gi 时,我们可以将饼干 j 分配给孩子 i,孩子 i 会被满足。 目标是最大化得到满足的孩子的数量并输出满足孩子的数量。 Example 1: Inp...

George的博客 888

数据结构与算法笔记:字典序最大问题分析

字典序最大问题 问题描述 给定一个1到n的排列(无序状态的),依次插入到栈中,在每时每刻都可以多次从栈中弹出栈顶 问:应如何使得弹出栈顶的序列的字典序最大,并输出这个序列 问题分析 什么是字典序 比如两个序列:5,4,3,2,1和1,2,3,4,5 这两个中第一个的字典序最大 每个位置上的数字比其他序列上同一位置的数字要大 比如:第一位置中5比1大,第二位置中4比2大这样 即:字典序最大 = 从左向右看这个序列,每个数字都尽量大 题目给定一个1到n的排列,每个数字只出现一次 要使出栈的字典序最大

Wang的专栏 4393

数据结构与算法笔记:农夫过河问题python3实现

问题描述 农夫(Human)过河。一个农夫带着一只狼(Wolf),一只羊(Sheep)和一些菜(Vegetable)过河。河边只有一条船,由于船太小,只能装下农夫和他的一样东西。在无人看管的情况下,狼要吃羊,羊要吃菜,请问农夫如何才能使三样东西平安过河? 要求: 输出一行,为最终的过河方式,方案格式为 过河人员、回来人员、过河人员、回来人员、…、过河人员。 过去和回来的人员之间,用空格隔开。 以四...

Wang的专栏 3374
上一篇: 数据结构与算法之贪心: LeetCode 122. 买卖股票的最佳时机II (Ts, Py, Go版)
下一篇: 数据结构与算法之贪心: LeetCode 860. 柠檬水找零 (Ts, Py, Go版)
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值