分发饼干(力扣455)


文章目录

  • 题目
  • 贪心算法
    • 思想概述
    • 关键要素
    • 解题步骤
    • 优缺点
      • 优点
      • 缺点
    • 应用领域
  • 题解
    • 一、思路
    • 二、解题方法
    • 三、Code
  • 总结


题目

Problem: 455. 分发饼干

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 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.

贪心算法

在这里插入图片描述
当我们谈论贪心算法(Greedy Algorithm)时,我们实际上在讨论一种基于贪心策略的算法思想。它通常用于解决最优化问题,其中问题的解决方案可以通过一系列局部最优选择来逐步构建全局最优解。

思想概述

贪心算法的核心思想是每一步都选择当前状态下的最佳解决方案,而不考虑之后步骤可能带来的影响。这种“贪心”策略意味着在每个阶段做出局部最优的选择,希望最终达到全局最优。贪心算法并不总是能够找到问题的最优解,但在某些情况下却能得到接近最优解的结果。

关键要素

  1. 最优子结构性质: 问题的最优解可以通过子问题的最优解来推导。这意味着问题的整体最优解可以通过局部最优解来构建。

  2. 贪心选择性质: 贪心算法每一步都选择局部最优解,而不考虑之后的结果。这种选择性质确保了局部最优解的累积能够构成全局最优解。

解题步骤

  • 确定问题的贪心策略: 首先要明确在当前状态下应该如何做出局部最优选择,即确定贪心策略。

  • 将问题划分为子问题: 确定好贪心策略后,将问题划分为一系列子问题,每个子问题都可以独立求解。

  • 逐步构建解决方案: 根据贪心策略,逐步构建问题的解决方案,每一步都做出局部最优选择。

  • 检查是否满足最优性: 在构建解决方案的过程中,需要时刻检查所做的局部最优选择是否满足最优性质。有时候需要证明该贪心策略确实能够得到全局最优解。

优缺点

优点

  • 算法简单、容易实现。

  • 执行速度快,通常时间复杂度较低。

  • 适用于一些特定类型的问题,能够找到近似最优解。

缺点

  • 不能保证得到全局最优解,可能会陷入局部最优解。
  • 需要证明贪心策略满足最优性质,有时比较困难。
  • 不适用于所有类型的问题,有些问题并不适合贪心算法。

应用领域

贪心算法在许多领域都有应用,特别是那些满足最优子结构性质的问题,如:最短路径问题,最小生成树问题,区间覆盖问题,部分背包问题,活动选择问题,哈夫曼编码等。在这些问题中,贪心算法可以提供高效的解决方案,使其成为解决实际问题的有力工具。


题解

一、思路

通过局部最优推到全局最优,这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。使用贪心策略,先将饼干数组和小孩数组排序

然后从前向后遍历小孩数组,用小饼干优先满足胃口小的,并统计满足小孩数量。
或者从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。如下图为第二种方法:
在这里插入图片描述

二、解题方法

排序两个数组,count计数喂饱了几个孩子,从前往后先遍历饼干尺寸s,start下标从胃口g开始遍历,当饼干满足胃口时,start下标才向后移动一位,否则继续遍历饼干尺寸直到找到刚好满足胃口的饼干尺寸。

for (int i = 0; i < s.length && start < g.length; i++) {if (s[i] >= g[start]) {start++;count++;}}

还有一种情况就是让start指向最大的饼干尺寸,从后往前先遍历胃口g,如果找到满足最大胃口的最大饼干尺寸s的话,就找下一块更小的饼干

for (int index = g.length - 1; index >= 0; index--) {if(start >= 0 && g[index] <= s[start]) {start--;count++;}}

注意事项:这里遍历的顺序不能改变,如果是从前往后遍历的话,要先遍历饼干的尺寸,再遍历胃口;而如果是从后往前遍历的话,要先遍历胃口,再遍历饼干的尺寸。

如果是从后往前先对尺寸遍历再遍历胃口的话,当胃口比所有饼干的尺寸都大的话,那么直到所有尺寸都遍历完的时候,if条件内也不会走逻辑。外面的 for 是里的下标 i 是固定移动的,而 if 里面的下标 index 是符合条件才移动的。就是出现如下情况:
在这里插入图片描述
if 里的 index 指向 胃口 10, for 里的 i 指向饼干 9,因为 饼干 9 满足不了 胃口 10,所以 i 持续向前移动,而 index 走不到s[index] >= g[i] 的逻辑,所以 index 不会移动,那么当 i 持续向前移动,最后所有的饼干都匹配不上。

三、Code

小饼干先喂饱小胃口

class Solution {// 思路1:优先考虑饼干,小饼干先喂饱小胃口public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int count = 0;int start = 0;for (int i = 0; i < s.length && start < g.length; i++) {if (s[i] >= g[start]) {start++;count++;}}return count;}
}

大饼干先喂饱大胃口

class Solution {// 思路2:优先考虑胃口,先喂饱大胃口public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int count = 0;int start = s.length - 1;// 遍历胃口for (int index = g.length - 1; index >= 0; index--) {if(start >= 0 && g[index] <= s[start]) {start--;count++;}}return count;}
}

总结

以上就是针对这道题的刷题笔记,用到了贪心算法解决分发饼干问题,通过找到充分利用饼干尺寸喂饱一个小孩局部最优解从而推出全局最优解。希望这篇题解能够帮助到你解决这个问题。如果有任何疑问或者建议,欢迎留言讨论!🌹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024 ccfcsp认证打卡 2023 05 01 重复局面

2023 05 01 重复局面 题目题解1题解2区别&#xff1a;数据存储方式&#xff1a;时间复杂度&#xff1a;空间复杂度&#xff1a; 总结&#xff1a; 题目 题解1 import java.util.*;public class Main {public static void main(String[] args) {Scanner input new Scanner(Sys…

Stream 流和 Lambda 组装复杂父子树形结构

在最近的开发中&#xff0c;遇到了两个类似的需求&#xff1a;都是基于 Stream 的父子树形结构操作&#xff0c;返回 List 集合对象给前端。于是在经过需求分析和探索实践后有了新的认识&#xff0c;现在拿出来和大家作分享交流。 一般来说完成这样的需求大多数人会想到递归&a…

面试题 之 vue

1.vue里怎样实现双向数据绑定&#xff1f; Viewmodel 中的Domlisteners 工具会帮我们检测页面上Dom元素的变化&#xff0c;如果有变化&#xff0c;则更改Model中的数据&#xff0c;更新model中的数据时&#xff0c;数据事件绑定工具会帮我们更新页面中的Dom元素 2.Vue的响应式原…

3d代理模型怎么转换成标准模型---模大狮模型网

在当今的虚拟世界中&#xff0c;3D建模技术被广泛运用于游戏开发、电影制作、工业设计等领域。在3D建模过程中&#xff0c;有时会遇到需要将代理模型转换成标准模型的情况。模大狮将从理论和实践两方面&#xff0c;介绍如何将3D代理模型转换成标准模型&#xff0c;以帮助读者更…

【MySQL】事务是什么?事务的特性又是什么?

文章目录 ✍事务是什么&#xff1f;✍事务的特性&#xff08;四个&#xff09;✍事务并发时出现的问题✍事务的隔离性 ✍事务是什么&#xff1f; 事务是由一个或多个SQL语句构成的&#xff0c;在事务中&#xff0c;这些的SQL不可分割&#xff0c;是一个整体&#xff0c;整个事…

C++万物起源:类与对象(三)拷贝构造、赋值重载

目录 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 1.2拷贝构造的实现 1.3默认构造函数 1.4拷贝构造函数典型调用场景 二、赋值运算符重载 2.1赋值运算符重载的格式 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 在c语言语法中&#xff0c;我们可以将一个变量赋值给…

vue实现导出列表为xlsx文件

1.安装依赖 npm install --save xlsx file-saver 2.引入依赖 import FileSaver from file-saver; import * as XLSX from xlsx; 3.代码实现 <el-button type"primary" click"exportData">导出数据</el-button><el-tableid"table_ex…

怎样在Linux搭建NTP服务器

搭建 NTP&#xff08;Network Time Protocol&#xff09;服务器可以帮助你在局域网内提供时间同步服务&#xff0c;让网络中的设备都使用统一的时间。以下是在 Linux 系统上搭建 NTP 服务器的基本步骤&#xff1a; 安装 NTP 服务器软件&#xff1a; 在终端中执行以下命令安装 N…

JavaSE阶段十组易混淆概念总结

目录 &#x1f4cc; & 与 && &#x1f4cc; this 与 super &#x1f4cc; 方法重载与重写 &#x1f4cc; 抽象类与接口 &#x1f4cc; "" 与 equals &#x1f4cc; String 与 StringBuffer &#x1f4cc; HashSet 与 HashMap &#x1f4cc; Coll…

【CANN训练营笔记】Atlas 200I DK A2体验手写数字识别模型训练推理

环境介绍 开发板&#xff1a;Huawei Atals 200I DK A2 内存&#xff1a;4G NPU&#xff1a;Ascend 310B4 CANN&#xff1a;7.0 准备环境 下载编译好的torch_npu wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/wanzutao/torch_npu-2.1.0rc1-cp39-cp39-linux_aarch…

烂笔头笔记:Windows 11下照片查看器显示偏色问题修复

本文出处&#xff1a;http://blog.csdn.net/chaijunkun/article/details/137278931&#xff0c;转载请注明。由于本人不定期会整理相关博文&#xff0c;会对相应内容作出完善。因此强烈建议在原始出处查看此文。 最近在研究HDR视频的截图算法&#xff0c;目的就是生成色彩正确…

基于Springboot + MySQL + Vue 大学新生宿舍管理系统 (含源码)

目录 &#x1f4da; 前言 &#x1f4d1;摘要 &#x1f4d1;操作流程 &#x1f4da; 系统架构设计 &#x1f4da; 数据库设计 &#x1f4ac; 管理员信息属性 &#x1f4ac; 学生信息实体属性 &#x1f4ac; 宿舍安排信息实体属性 &#x1f4ac; 卫生检查信息实体属性 &…

pytest--python的一种测试框架--接口测试

接口测试 工具&#xff1a; POSTMAN&#xff1b; 接口选择&#xff1a; 豆瓣电影&#xff0c;进制数据 POSTMAN下载&#xff1a; 1.POSTMAN官网&#xff1a;https://www.postman.com/products/&#xff1b; 2.点product选Download Postman 下载完之后双击打开就可以用的。…

Element-Plus日期选择组件封装农历日期

背景 在使用element-plus开发项目过程中&#xff0c;需要填入人员的生卒日期&#xff0c;经观察&#xff0c;对于大部分人来说&#xff0c;这类日期通常是农历日期&#xff0c;然而我们在系统建设过程中&#xff0c;对于日期字段&#xff0c;约定成俗的都会使用公历日期&#…

Lecture 1 - Introduction

Lecture 1 - Introduction MIT 6.824 Distributed Systems 1、概念预览 分布式系统需要考虑的因素&#xff1a; Parallelism &#xff1a;并行性Fault tolerence &#xff1a;容错性Physicial &#xff1a;不同系统之间物理距离引起的通信问题Security &#xff1a;不同的计…

封装一个vue3的公共组件

在Vue 3中&#xff0c;封装公共组件的场景包括但不限于以下几种情况&#xff1a; 重复使用的组件&#xff1a;如果你发现某个组件在多个地方重复使用&#xff0c;那么将其封装成公共组件是很有意义的。比如&#xff0c;页面中的各种表单控件&#xff08;输入框、下拉框、日期选…

MySQL 数据学习笔记速查表(视图、存储过程、事务)

文章目录 十三、视图1、视图是什么&#xff1f;2、视图的特性&#xff1f;3、视图的作用&#xff1f;4、视图的用途&#xff1f;5、视图的使用&#xff1f;1、基本语法2、创建视图3、调用视图4、视图练习(1) 利用试图简化复杂的联结(2) 利用视图重新格式化检索出的数据(3) 利用…

Django详细教程(一) - 基本操作

文章目录 前言一、安装Django二、创建项目1.终端创建项目2.Pycharm创建项目&#xff08;专业版才可以&#xff09;3.默认文件介绍 三、创建app1.app介绍2.默认文件介绍 四、快速上手1.写一个网页步骤1&#xff1a;注册app 【settings.py】步骤2&#xff1a;编写URL和视图函数对…

Node爬虫:原理简介

在数字化时代&#xff0c;网络爬虫作为一种自动化收集和分析网络数据的技术&#xff0c;得到了广泛的应用。Node.js&#xff0c;以其异步I/O模型和事件驱动的特性&#xff0c;成为实现高效爬虫的理想选择。然而&#xff0c;爬虫在收集数据时&#xff0c;往往面临着诸如反爬虫机…

OSPF-基础、虚链路、overflow,缺省

OSPF 1、OSPF基础 2、区域内的路由计算 3、区域间的路由计算&#xff08;矢量&#xff09;&#xff08;区域间的防环原则&#xff09; 3.1、非骨干区域都与骨干区域相连。 3.2、骨干区域不会接收非骨干的3类LSA。 3.3、无论COST&#xff0c;1类LSA总是由于3类LSA。 ABR&…