leetCode 455.分发饼干 贪心算法

news/2024/10/17 21:20:11/

455. 分发饼干 - 力扣(LeetCode)

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 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.

>>贪心思路(以下文字来自代码随想录代码随想录 (programmercarl.com)

为了满足更多的小孩,就不要造成饼干尺寸的浪费。大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。可以尝试使用贪心策略,先将饼干数组和小孩数组排序。然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。

  • ① 排序
  • ② 确定遍历顺序
  • ③ 统计

  • 先遍历小孩数组,再遍历饼干数组
class Solution {
public:// 方法一:// 局部最优 : 大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个// 全局最优就是喂饱尽可能多的小孩// 时间复杂度:O(nlogn) 空间复杂度:O(1)int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(),g.end());sort(s.begin(),s.end());int j = s.size()-1;// 饼干数组的下标int result = 0;for (int i = g.size() - 1; i >= 0; i--) { // 遍历胃口if(j>=0 && s[j]>=g[i]) {// 遍历饼干result++;j--;}}return result;}
};
  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(1)

  • 先遍历饼干数组,再遍历小孩数组
class Solution {
public:// 方法二// 小饼干先喂饱小胃口// 时间复杂度:O(nlogn) 空间复杂度:O(1)int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(),g.end());sort(s.begin(),s.end());int i = 0;// 饼干数组的下标int result = 0;for (int j = 0; j < s.size(); j++) { // 遍历饼干if(i < g.size() && s[j]>=g[i]) { // 遍历胃口result++;i++;}}return result;}
};
  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(1)

来自代码随想录课堂截图:

参考和推荐文章、视频

代码随想录 (programmercarl.com)

贪心算法,两者兼顾很容易顾此失彼!LeetCode:135.分发糖果_哔哩哔哩_bilibili


http://www.ppmy.cn/news/1132047.html

相关文章

使用CreateProcess崩溃:处未处理的异常: 0xC0000005: 写入位置 0x00415652 时发生访问冲突

问题代码 if (!CreateProcess(NULL,L"pela.exe",NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)){return 0;}如果CreateProcess的第二个参数字符串是常量或者是储存在堆中的就会被写保护&#xff0c;崩溃。如果字符串定义到栈或者全局变量就不存在此问题了。 正确的…

MySQL 通过存储过程高效插入100w条数据

目录 一、前言二、创建表三、编写存储过程插入数据四、高效插入数据方案4.1、插入数据时删除表中全部索引4.2、存储过程中使用统一事务插入&#xff08;性能显著提升&#xff09;4.3、调整MySQL系统配置&#xff08;性能显著提升&#xff0c;适合存储过程没有使用统一事务&…

Vim同时打开多个文件

分屏模式 在 Vim 中&#xff0c;可以同时打开多个文件并使用分屏模式来查看它们。以下是一些常见的方法和命令&#xff1a; 在启动 Vim 时打开多个文件 使用 -o 选项打开文件并水平分屏&#xff1a; vim -o file1.txt file2.txt使用 -O 选项打开文件并垂直分屏&#xff1a; v…

集合-ArrayList源码分析(面试)

系列文章目录 1.集合-Collection-CSDN博客​​​​​​ 2.集合-List集合-CSDN博客 3.集合-ArrayList源码分析(面试)_喜欢吃animal milk的博客-CSDN博客 目录 系列文章目录 前言 一 . 什么是ArrayList? 二 . ArrayList集合底层原理 总结 前言 大家好,今天给大家讲一下Arra…

注解实现策略模式

注解实现策略模式 1. 使用idea创建sprignboot项目2. 创建策略接口3. 创建策略类型注解4. 创建两个具体策略类5. 策略工厂类6. 使用 1. 使用idea创建sprignboot项目 2. 创建策略接口 public interface Handler {Double callPrice(Double price);}3. 创建策略类型注解 Target(…

Java多态调用成员的特点

Java多态调用成员的特点

【并发编程】ThreadPoolExecutor任务提交与停止流程及底层实现【新手探索版】

文章目录 1. ThreadPoolExecutor任务提交2. 线程池状态[这部分是难点呀]2.1. addWorker添加worker线程2.2. 内部类Worker2.3. runWorker():执行任务2.4. getTask():获取任务2.5. processWorkerExit():worker线程退出 3.3. 关闭线程池3.3.1. shutdown方法3.3.2. shutdownNow方法…

Feign接口调用GET请求@RequestParam传参丢失

文章目录 问题现象排查解决GET加注解解决使用POST方式解决 时间戳传参失败 问题现象 项目使用的是Spring Cloud微服务&#xff0c;服务间调用使用的是Feign在一次服务调用时&#xff0c;发现GET传参丢失&#xff0c;没有传递过去任何参数加了RequestParam注解&#xff0c;发现…