坚持刷题|分发饼干

文章目录

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

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)); // 输出:1

        int[] 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. 问:如果孩子或饼干的数量非常大,会对这个算法的性能有什么影响?

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习实战73-基于多模态CLIP模型的实战项目,CLIP模型的架构介绍与代码实现

大家好,我是微学AI,今天给大家介绍一下深度学习实战73-基于多模态CLIP模型的实战项目,CLIP模型的架构介绍与代码实现。多模态CLIP(Contrastive Language-Image Pre-training)模型是一种深度学习模型,其核心设计理念是通过大规模的对比学习训练,实现图像与文本之间的跨模…

Linux——进程管理

目录 作业和进程的概念 程序与进程的关系 查看进程信息——ps&#xff0c;top ps命令 top命令 设置进程的优先级——nice&#xff0c;renice nice命令 renice命令 查看进程信息——pgrep&#xff0c;pstree pgrep命令 pstree命令 切换进程——jobs&#xff0c;bg&a…

【linux】基础IO(一)

文件只有站在系统层面才能彻底理解 简单回顾一下文件&#xff1a; 首先我们要明确一点&#xff0c;我们说的打开文件不是写下fopen就打开文件&#xff0c;而是当我们的进程运行起来&#xff0c;进程打开的文件。 我们在C语言一般都会使用过如下的代码进行向文件中写入 但是除…

Oracle客户端如何连接远程数据库?

Oracle是一种常用的数据库管理系统&#xff0c;它具有高效、稳定的特性&#xff0c;广泛应用于各行各业。为了实现远程数据库的连接&#xff0c;我们可以使用Oracle客户端工具。本文将介绍如何使用Oracle客户端连接远程数据库&#xff0c;并讨论其使用场景。 Oracle客户端工具 …

sql中如何添加数据?

添加 在 SQL 中添加数据通常使用INSERT语句。INSERT语句用于将新的数据行插入到数据库表中。 基本的INSERT语句语法如下&#xff1a; INSERT INTO table_name (column1, column2,...) VALUES (value1, value2,...);其中&#xff1a; INSERT INTO&#xff1a;指定要插入数据…

利用Flutter的特性最大程度提升iOS应用的用户体验

本文探讨了使用Flutter开发的iOS应用能否上架&#xff0c;以及上架的具体流程。苹果提供了App Store作为正式上架渠道&#xff0c;同时也有TestFlight供开发者进行内测。合规并通过审核后&#xff0c;Flutter应用可以顺利上架。但上架过程可能存在一些挑战&#xff0c;因此可能…

SSM框架学习——MVC模式与三层架构

MVC模式与三层架构 什么是MVC模式 MVC模式代表Model-View-Controller&#xff08;模型-视图-控制器&#xff09;模式。这种应用模式用于应用程序的分层开发。 Model代表存取数据的对象&#xff0c;它自身可带有逻辑&#xff0c;数据变化时更新Controller。View代表Model包含…

最牛的音乐大模型-suno 音乐界的ChatGPT

一、前言 之前一直对音乐是无感的&#xff0c;但随着 suno.ai 大火&#xff0c;开始喜欢上了音乐&#xff0c;喜欢上了音乐创作的 二、suno介绍 2.1 基本介绍 基于 Suno 任何人都可以创作美妙音乐。无论您是歌手还是艺术家抑或是对音乐一无所知的人&#xff0c;suno都会打破…

STM32(1):系统架构地址映射

STM32&#xff08;1&#xff09;&#xff1a;系统架构&地址映射 前提摘要 个人说明&#xff1a; 限于时间紧迫以及作者水平有限&#xff0c;本文错误、疏漏之处恐不在少数&#xff0c;恳请读者批评指正。意见请留言或者发送邮件至&#xff1a;“Email:noahpanzzzgmail.com…

基因组Survey分析

流程图&#xff1a; 图片来源&#xff1a;https://www.jianshu.com/p/94da86093843 一、Fastp质控 二、NT比对 一般选择第六个输出格式 结果示例&#xff1a; 三、k-mer分析 软件&#xff1a;GCE/genomescope 分析目的&#xff1a;预估基因组大小&#xff0c;重复序列比…

团聚金刚石研磨液为高性能研磨抛光材料 中机新材是国内领先供应商

团聚金刚石研磨液为高性能研磨抛光材料 中机新材是国内领先供应商 团聚金刚石研磨液是一种高性能研磨抛光材料&#xff0c;是以团聚金刚石微粉为原料采用特殊配方配制而成。团聚金刚石微粉是由金刚石微粉、粘结剂经特殊工艺处理集合而成的球形磨料。金刚石微粉制备方式多样&am…

4年经验来面试20K的测试岗,一问三不知,我还真不如去招应届生。

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是4年工作经验&#xff0c;但面试…

使用Java流API构建树形结构数据

简介&#xff1a; 在实际开发中&#xff0c;构建树状层次结构是常见需求&#xff0c;如组织架构、目录结构或菜单系统。本教案通过解析给定的Java代码&#xff0c;展示如何使用Java 8 Stream API将扁平化的菜单数据转换为具有层级关系的树形结构。 1. 核心类定义 - Menu Data…

中科驭数超低时延网络解决方案入选2023年度金融信创优秀解决方案

近日&#xff0c;由中国人民银行领导、中国金融电子化集团有限公司牵头组建的金融信创生态实验室发布「2023年度第三期金融信创优秀解决方案」&#xff0c;中科驭数超低时延网络解决方案从众多方案中脱颖而出&#xff0c;成功入选&#xff0c;代表了该方案的技术创新和金融实践…

Servlet基础 管理员注册页面

管理员注册页面 index.jsp <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":&quo…

Linux下javaweb项目部署

javaweb项目部署测试 测试环境&#xff1a;centos7 下载安装jdk rpm -ivh jdk-8u131-linux-x64.rpm 下载安装MySQL wget https://downloads.mysql.com/archives/get/p/23/file/mysql-community-server-5.7.33-1.el7.x86_64.rpm https://downloads.mysql.com/archives/get/p…

Android12 简单的共享内存驱动实现 参考Ashmem

Android12 共享内存驱动实现 SOC&#xff1a;RK3568 system&#xff1a;Android12 概述&#xff1a; 1. 概述 Ashmem&#xff08;Anonymous Shared Memory&#xff0c;Android 匿名共享内存&#xff09;&#xff0c;它基于 mmap 系统调用&#xff0c;可以让不同进程将同一段…

DHCP服务

DHCP简介 DHCP&#xff08;DynamicHost ConfigurationProtocol&#xff0c;动态主机配置协议&#xff09;通常被应用在大型的局域网络环境中&#xff0c;主要作用是集中的管理、分配IP地址&#xff0c;使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息&…

Flutter应用在App Store上架的完整指南

本文探讨了使用Flutter开发的iOS应用能否上架&#xff0c;以及上架的具体流程。苹果提供了App Store作为正式上架渠道&#xff0c;同时也有TestFlight供开发者进行内测。合规并通过审核后&#xff0c;Flutter应用可以顺利上架。但上架过程可能存在一些挑战&#xff0c;因此可能…

Git版本管理使用手册 - 8 -拉取开发分支、提交代码、查看提交日志

开发者从仓库获取开分支&#xff08;检出分支以及分支切换&#xff09; 根据仓库地址克隆的本地仓库&#xff0c;目录中默认是master的代码&#xff0c;即工作区是master代码&#xff0c;需要某一开发分支时&#xff0c;需要在工作区切换或者idea中先更新再切换分支&#xff0…