坚持刷题|分发饼干

2024-04-02 15:36
文章标签 刷题 分发 坚持 饼干

本文主要是介绍坚持刷题|分发饼干,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 题目
  • 思路
  • 代码实现
  • 实现总结
    • 主要步骤
    • 时间复杂度
  • 扩展问题

Hello,大家好,我是阿月。坚持刷题,老年痴呆追不上我,今天刷第一个贪心算法:分发饼干

题目

455.分发饼干
在这里插入图片描述

思路

要解决这个问题,可以使用贪心算法。具体步骤如下:

  1. 首先,对孩子们的胃口值 g[i] 和饼干的尺寸 s[j] 进行排序。
  2. 然后,从胃口值最小的孩子开始遍历,尝试满足他们的胃口。
  3. 对于每个孩子,找到能够满足其胃口的最小尺寸的饼干,尽可能地用小的饼干满足孩子,以便给其他孩子留下更大的饼干。
  4. 继续这个过程,直到所有的孩子都被满足或者没有足够的饼干。

代码实现

import java.util.Arrays;public class CookieAndChildren {public static int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int childIndex = 0;int count = 0;for (int i = 0; i < s.length && childIndex < g.length; i++) {if (s[i] >= g[childIndex]) {count++;childIndex++;}}return count;}public static void main(String[] args) {int[] g = {1, 2, 3};int[] s = {1, 1};System.out.println(findContentChildren(g, s)); // 输出:1int[] g2 = {1, 2};int[] s2 = {1, 2, 3};System.out.println(findContentChildren(g2, s2)); // 输出:2}
}

实现总结

这个问题考察的是贪心算法的应用。贪心算法是一种在每一步选择中都采取当前状态下最优决策的策略,从而希望导致全局最优解。

在这个问题中,要尽可能地满足更多数量的孩子,因此采取了贪心策略:首先对孩子的胃口值和饼干的尺寸进行排序,然后从胃口值最小的孩子开始遍历,并尽可能用小的饼干满足他们的胃口。这样做的原因是,如果用一个大的饼干去满足一个小胃口的孩子,那么这个大饼干就可能无法满足更大胃口的孩子,导致最终满足的孩子数量较少。因此,选择尽可能小的饼干来满足胃口最小的孩子可以使得留下的饼干更有可能满足后面的孩子。

主要步骤

  1. 首先,对孩子的胃口值数组 g 和饼干的尺寸数组 s 进行排序,以便后续能够按照从小到大的顺序进行匹配。
  2. 使用两个变量 startcount 分别表示当前要满足的孩子的索引和已满足孩子的数量。初始化 start 为 0,count 为 0。
  3. 使用一个循环遍历饼干数组 s,并在循环中对比当前饼干的尺寸是否能够满足当前孩子的胃口。如果能够满足,则将 count 加一,并将 start 向后移动一位,表示已满足一个孩子。
  4. 最后返回满足孩子的数量 count
    这个实现利用了数组的排序,使得在遍历饼干数组时可以更有效地匹配满足孩子的胃口。同时,通过一次遍历,即可确定最终满足的孩子数量,具有较高的效率。

时间复杂度

这段代码的时间复杂度取决于两个排序操作和单次遍历操作。

  1. 对孩子的胃口值数组 g 和饼干的尺寸数组 s 进行排序的时间复杂度为 O(n log n),其中 n 是数组的长度。
  2. 单次遍历操作的时间复杂度为 O(n),其中 n 是较小的数组的长度(饼干数组或孩子数组)。
    因此,总的时间复杂度为 O(n log n),其中 n 是较小的数组的长度。

扩展问题

在面试或者工作学习中,可能会有进一步的问题。

  1. 问:为什么要对孩子的胃口值和饼干的尺寸进行排序?

    答: 对孩子和饼干进行排序的目的是为了更有效地匹配饼干和孩子。通过排序,我们可以在一次遍历中完成所有匹配,而无需额外的操作。这样做还可以使得算法更简洁高效。

  2. 问:这个算法的时间复杂度是多少?

    答: 这个算法的时间复杂度是 O(n log n),其中 n 是较小的数组的长度。这是因为在排序阶段需要对数组进行排序,而排序算法的时间复杂度通常是 O(n log n),而后面的单次遍历操作的时间复杂度为 O(n)。

  3. 问:有没有其他方法来解决这个问题?

    答: 是的,还可以使用其他方法来解决这个问题,例如递归、动态规划等。但是在这个问题中,贪心算法是一种简单而有效的解决方法,可以在 O(n log n) 的时间复杂度内得到解决。

  4. 问:如果孩子或饼干的数量非常大,会对这个算法的性能有什么影响?

    答: 如果孩子或饼干的数量非常大,可能会导致排序操作的时间开销变得非常显著。此时,选择更适合大规模数据的排序算法(如快速排序)可能是一个更好的选择。另外,在极端情况下,可能需要考虑优化算法以减少排序的时间复杂度,或者使用并行化技术来加速排序过程。

这篇关于坚持刷题|分发饼干的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/870367

相关文章

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II 1.题目 1.1递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0491.%E9%80%92%E

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II 1.题目 1.1复原IP地址 题目链接:93. 复原 IP 地址 - 力扣(LeetCode) 视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0093.%E5%A4%8

【笔记】数据结构刷题09

快速排序 215. 数组中的第K个最大元素 class Solution {public:int findKthLargest(vector<int>& nums, int k) {return divide(nums,0,nums.size()-1,nums.size()-k);}int divide(vector<int>& nums,int left,int right,int k)

C语言:刷题日志(1)

一.阶乘计算升级版 本题要求实现一个打印非负整数阶乘的函数。 其中n是用户传入的参数,其值不超过1000。如果n是非负整数,则该函数必须在一行中打印出n!的值,否则打印“Invalid input”。 首先,知道阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1。那么我们先来个简单的阶乘计算吧。 #include<stdio.h>int Fact(int n){if (n <=

【每日刷题】Day112

【每日刷题】Day112 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 1137. 第 N 个泰波那契数 - 力扣(LeetCode) 2. 面试题 08.01. 三步问题 - 力扣(LeetCode) 3. LCR 088. 使用最小花费爬楼梯 - 力扣(LeetCode) 1. 1137. 第 N 个泰波那契数 - 力扣(LeetCo

Unity Adressables 使用说明(四)分发远程内容(Distribute Remote Content)

概述 远程分发内容可以减少应用程序的初始下载大小和安装时间。你还可以更新远程分发的资源,而无需重新发布应用程序或游戏。 当你将远程 URL 分配为 Group 的加载路径(Load Path)时,Addressables 系统会从该 URL 加载组中的资源。当你启用Build Remote Catalog选项时,Addressables 会在 Remote Catalog 中查找任何远程资源的

【数据结构】【java】leetcode刷题记录--链表

简介 链表是一种常见的基础数据结构,它由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。在Java中,链表通常用于实现动态数据结构,因为它可以根据需要动态地增加或减少节点。 链表简介: 节点结构:链表中的每个元素称为节点(Node),每个节点包含两部分:数据域(存储数据)和指针域(存储下一个节点的地址)动态性:链表的长度不是固定的,可以根据需要动态地增减节点。内存分配:链表中的节点

LiveGBS流媒体平台GB/T28181功能-支持RTSP流分发支持GB28181国标流转RTSP流如何配置RTSP视频直播流输出

LiveGBS支持RTSP流分发支持GB28181国标流转RTSP流如何配置RTSP视频直播流输出 1、开启RTSP1.1、页面配置1.2、ini文件配置 2、配置RTSP流用户密码3、RTSP流地址(接口调用)4、RTSP流地址(静态拼接获取)5 、相关问题6、搭建GB28181视频直播平台 1、开启RTSP 1.1、页面配置 在基础配置 -> 流媒体服务配置中配置,RTSP