通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)
看完本文,可以顺便解决leetcode以下两个题目:
455.分发饼干(简单)
135.分发糖果(困难)
一、通俗易懂的 贪心算法 |思想
贪心算法就是采用贪心的策略,保证每一次的操作都是局部最优的,从而使得结果是全局最优的。
比如,A、B、C、都很喜欢吃橘子,A可以吃5个、B可以吃3个、C可以吃1个;但是现在只有7个橘子,问最多几个人可以吃饱;
我们选用的贪心策略就是,吃的少的人先吃,尽量先使用量少的人吃饱,所以在这里,B、C肯定是可以吃饱的;
在这里,又因为全局结果是局部结果的简单求和,因此,局部最优的策略同样也是全局最优的策略。
二、分配问题
455.分发饼干(简单)
题目描述
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值
来源:力扣(LeetCode)
输入输出样例
输入: g = [1,2,3], s = [1,1] 输出: 1 解释: 你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。所以你应该输出1。
来源:力扣(LeetCode)
题解
根据我们局部最优的思想,当然是饥饿度小的孩子先吃了,毕竟饼干只有这么多,但是同时应该尽量使得剩下的饼干大小能够满足后面的孩子去吃;
因此,我们应该在饼干大小 >= 这个孩子饥饿度的饼干中,寻找到最小的那个饼干去喂他;满足一个孩子吃饱之后,继续使用同样的方法去喂饱下一个孩子,知道不能满足条件为止;
简而言之就是,给饥饿度小的孩子分配满足条件的饼干中大小最小的饼干。
class Solution {public:int findContentChildren(vector<int>& g, vector<int>& s) {//贪心算法 先排序 然后依次比较sort(g.begin(),g.end()); //g 胃口 s 饼干大小sort(s.begin(),s.end());int i = 0,j = 0;while(i < g.size() && j < s.size()) {if(g[i] <= s[j]) {i++;}j++;}return i;}
};
135.分发糖果(困难)
题目描述
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?
来源:力扣(LeetCode)
我们继续来把题目描述的通俗一些:有评分属性的孩子,排成一排,每一个孩子至少有一个糖果,如果一个孩子比左右两个孩子评分高,则他的糖果肯定要比左右两位的高
输入输出样例
输入:[1,0,2]
输出:5
解释:你可以分别给这三个孩子分发 2、1、2 颗糖果。
题解
述455题,我们首先对于数据进行了排序,这是数据处理的常规操作,为了方便后续的大小比较;
但是此题我们使用两次遍历;我们的贪心策略是:每一次遍历只考虑相邻一侧的关系;
1)每一个孩子的糖果初始化 1
2)从左到右遍历一次;如果右边孩子比左边孩子评分高,那么右边孩子得到的糖果比左边的多一个;
3)从右到左遍历一次;如果左边孩子比右边孩子评分高,而且当前左边孩子的糖果是比右边孩子糖果少,那么左边孩子得到的糖果比右边的多一个;
class Solution {public:int candy(vector<int>& ratings) {int size = ratings.size();if (size < 2) {return size;}vector<int> num(size,1); // 先都给一个糖果for (int i = 1; i < size; ++i ) { // 从左到右if (ratings[i] > ratings[i-1]) {num[i] = num[i-1] + 1;}}for (int i = size-1; i > 0; --i ) { // 从右到左if (ratings[i] < ratings[i-1]) {num[i-1] = max(num[i-1],num[i] + 1);}}return accumulate(num.begin(),num.end(),0);}
};
通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)相关推荐
- 力扣455.分发饼干(java)-贪心算法思想及基本步骤
文章目录 贪心算法核心思想 基本步骤 455.分发饼干(Java) 1.需要考虑的问题 2.方案(序号分别与问题对应) 贪心算法核心思想 贪心算法的基本思想是每一步都做出当时看起来最佳的选择,可以理解 ...
- 力扣贪心算法专题(一)455.分发饼干 376. 摆动序列 53. 最大子序和 122.买卖股票的最佳时机II 1005.K次取反后最大化的数组和 思路及C++实现 贪心算法 动态规划
文章目录 贪心算法 455.分发饼干 思路 步骤 代码 376. 摆动序列 贪心算法 思路 分析 代码 动态规划 思路 步骤 代码 53. 最大子序和 暴力解法 双层for循环 贪心算法 思路 分析 ...
- 基本算法总结,力扣题目整理
系统性学习算法,扎实您的打码基本功! 作为算法初学者的我从19年8月份开始在力扣学习算法,到现在AC了700多道题目. 随着打卡题目数量的增多,我发现算法常见考察的知识点大概有十几种,包括:二分,滑动 ...
- 【算法竞赛】力扣杯春赛-个人赛 LCCUP‘23复盘
力扣杯春赛-个人赛 LCCUP'23 LCP 72. 补给马车 关键词:模拟 题目来源:LCP 72. 补给马车 - 力扣(Leetcode) 题目描述 T模拟 远征队即将开启未知的冒险之旅,不过在此 ...
- 算法第一天力扣---2651. 计算列车到站时间
1.题目要求: 给你一个正整数 arrivalTime 表示列车正点到站的时间(单位:小时),另给你一个正整数 delayedTime 表示列车延误的小时数. 返回列车实际到站的时间. 注意,该问题中 ...
- 双指针算法(四):力扣 88.合并两个有序数组 | 经典例题
题目描述 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 初始化 nums1 和 nums2 的元素数量分别为 m 和 ...
- 双指针算法(三):力扣【167.两数之和 | 经典例题
本文将讲述双指针算法的一个经典例题,167.两数之和 [题目描述] 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target . 函数应该以长 ...
- 力扣455. 分发饼干(JavaScript)
//从后往前遍历,先找到能满足的最大胃口的小孩 var findContentChildren = function(g, s) {g.sort((a,b)=>a-b)s.sort((a,b)= ...
- 算法题(2)力扣第n位数字
给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, -] 中找出并返回第 n 位上的数字. class Solution {public ...
最新文章
- linux内核链表使用例,linux内核链表的使用例子
- AlertDialog的使用(一)
- JAVA 中的数据结构
- 加密服务器显示到期,注册加密卡成功了,打开软件还是提示演示到期了,怎么解决?...
- linux windows 动态库导出查看 ld -r
- macOS -- 如何通过终端开启/关闭SSH
- bmob php修改数据,使用Bmob SDK实时数据功能的一次经历
- 使用PMBus总线监控电源管理芯片UCD90120
- 使用计算机制图的心得,学习cad制图心得体会
- 大学学计算机考试大一,大学计算机基础大一考试必备题库[1].pdf
- matlab2021a下载安装
- docker安装mysql后无法执行mysql命令
- SEGGER RTT使用总结
- 可以在树莓派上使用的交互式抠图软件
- windows xp sp2的产品密钥
- 行车记录仪数据被删除了怎么恢复?解决方法分享
- 华三HCL模拟器添加虚拟网卡连接外网、VMware虚拟机、实体机方法
- 中小企业的公司财务管理系统
- 为什么这几年电脑病毒不见了?
- JQuery 实现突出显示
热门文章
- C++ Primer 5th笔记(8)chapter8 类:IO库-流的缓冲区
- 数学建模——智能优化之模拟退火模型详解Python代码
- 01-Introducing the Arm architecture
- Django中Model继承的三种方式
- 熊猫烧香变种病毒分析
- 反编译APK文件的三种方法
- c/c++ typedef定义函数指针(Hook前奏2)
- Pycharm解决中文字体大小不一致问题
- 1094 The Largest Generation (25 分)【难度: 一般 / 树的遍历】
- 1049 Counting Ones (30 分)【难度: 难 / 知识点: 分治 / DP】