看完本文,可以顺便解决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分发糖果)相关推荐

  1. 力扣455.分发饼干(java)-贪心算法思想及基本步骤

    文章目录 贪心算法核心思想 基本步骤 455.分发饼干(Java) 1.需要考虑的问题 2.方案(序号分别与问题对应) 贪心算法核心思想 贪心算法的基本思想是每一步都做出当时看起来最佳的选择,可以理解 ...

  2. 力扣贪心算法专题(一)455.分发饼干 376. 摆动序列 53. 最大子序和 122.买卖股票的最佳时机II 1005.K次取反后最大化的数组和 思路及C++实现 贪心算法 动态规划

    文章目录 贪心算法 455.分发饼干 思路 步骤 代码 376. 摆动序列 贪心算法 思路 分析 代码 动态规划 思路 步骤 代码 53. 最大子序和 暴力解法 双层for循环 贪心算法 思路 分析 ...

  3. 基本算法总结,力扣题目整理

    系统性学习算法,扎实您的打码基本功! 作为算法初学者的我从19年8月份开始在力扣学习算法,到现在AC了700多道题目. 随着打卡题目数量的增多,我发现算法常见考察的知识点大概有十几种,包括:二分,滑动 ...

  4. 【算法竞赛】力扣杯春赛-个人赛 LCCUP‘23复盘

    力扣杯春赛-个人赛 LCCUP'23 LCP 72. 补给马车 关键词:模拟 题目来源:LCP 72. 补给马车 - 力扣(Leetcode) 题目描述 T模拟 远征队即将开启未知的冒险之旅,不过在此 ...

  5. 算法第一天力扣---2651. 计算列车到站时间

    1.题目要求: 给你一个正整数 arrivalTime 表示列车正点到站的时间(单位:小时),另给你一个正整数 delayedTime 表示列车延误的小时数. 返回列车实际到站的时间. 注意,该问题中 ...

  6. 双指针算法(四):力扣 88.合并两个有序数组 | 经典例题

    题目描述 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 初始化 nums1 和 nums2 的元素数量分别为 m 和 ...

  7. 双指针算法(三):力扣【167.两数之和 | 经典例题

    本文将讲述双指针算法的一个经典例题,167.两数之和 [题目描述] 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target . 函数应该以长 ...

  8. 力扣455. 分发饼干(JavaScript)

    //从后往前遍历,先找到能满足的最大胃口的小孩 var findContentChildren = function(g, s) {g.sort((a,b)=>a-b)s.sort((a,b)= ...

  9. 算法题(2)力扣第n位数字

    给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, -] 中找出并返回第 n 位上的数字. class Solution {public ...

最新文章

  1. linux内核链表使用例,linux内核链表的使用例子
  2. AlertDialog的使用(一)
  3. JAVA 中的数据结构
  4. 加密服务器显示到期,注册加密卡成功了,打开软件还是提示演示到期了,怎么解决?...
  5. linux windows 动态库导出查看 ld -r
  6. macOS -- 如何通过终端开启/关闭SSH
  7. bmob php修改数据,使用Bmob SDK实时数据功能的一次经历
  8. 使用PMBus总线监控电源管理芯片UCD90120
  9. 使用计算机制图的心得,学习cad制图心得体会
  10. 大学学计算机考试大一,大学计算机基础大一考试必备题库[1].pdf
  11. matlab2021a下载安装
  12. docker安装mysql后无法执行mysql命令
  13. SEGGER RTT使用总结
  14. 可以在树莓派上使用的交互式抠图软件
  15. windows xp sp2的产品密钥
  16. 行车记录仪数据被删除了怎么恢复?解决方法分享
  17. 华三HCL模拟器添加虚拟网卡连接外网、VMware虚拟机、实体机方法
  18. 中小企业的公司财务管理系统
  19. 为什么这几年电脑病毒不见了?
  20. JQuery 实现突出显示

热门文章

  1. C++ Primer 5th笔记(8)chapter8 类:IO库-流的缓冲区
  2. 数学建模——智能优化之模拟退火模型详解Python代码
  3. 01-Introducing the Arm architecture
  4. Django中Model继承的三种方式
  5. 熊猫烧香变种病毒分析
  6. 反编译APK文件的三种方法
  7. c/c++ typedef定义函数指针(Hook前奏2)
  8. Pycharm解决中文字体大小不一致问题
  9. 1094 The Largest Generation (25 分)【难度: 一般 / 树的遍历】
  10. 1049 Counting Ones (30 分)【难度: 难 / 知识点: 分治 / DP】