C++ 中的分配饼干2025年5月10日 | 阅读 9 分钟 分发饼干问题是一个简单的问题,它特别针对资源可用性有限的情况下,如何最大程度地满足需求。最初的编程面试题展示了贪心算法应用的几个关键原则。在这个问题中,我们有两个数组:第一个数组反映了孩子们“贪婪因子”,第二个数组是饼干的大小。目标是简单地将饼干分发给孩子们,以便在满足他们贪婪因子的前提下,尽可能多的孩子感到快乐,孩子的贪婪因子决定了孩子想要的最小饼干尺寸。 分发饼干问题很好地展示了贪心算法,并允许引入排序和已排序资源的顺序分配。它在最优控制等应用中形成了一项关键技术,我们必须在诸如汇总财务、管理计算机负载以及许多其他资源有限的计算问题中找到最佳解决方案。这种结构化的高效方式为在计算机科学和实际生活中解决其他各种优化和分配问题奠定了基础。 同样,每块饼干都有一个预设的尺寸,定义了它满足孩子需求的潜力。目标是让尽可能多的孩子快乐,并且每个孩子最多获得一块饼干,每块饼干最多给一个孩子。这种情况模仿了现实生活中的资源分配场景,其中有限的资源必须分配给少数有特定需求的收件人或用户。 分发饼干问题的解决方案采用了称为贪婪因子的特定策略,其中贪婪因子和饼干尺寸都按递增顺序排列。排序使得匹配过程协调一致,为满足每个孩子的最低可能份量以满足贪婪标准提供了机会。组合式首次拟合算法在每次迭代时从最贪婪的因子开始;它将孩子分配到它的饼干中,只有在找到足够大的饼干来满足当前孩子时,才会移动到下一个孩子。这种方法确保小饼干分给贪婪程度较低的孩子,同时将大饼干留给贪婪的孩子。 方法:双指针技术使用双指针方法,解决方案同时遍历两个数组。假设一块饼干满足了孩子的贪婪需求。在这种情况下,孩子的列表指针会变绿,表示孩子已满足,再次组织孩子的列表,并将孩子和饼干列表的指针都向前移动到下一个元素。 如果当前孩子没有得到饼干,只有饼干指针会向前移动,寻找一个可能满足孩子的更大饼干。匹配过程将持续进行,直到所有可用的分配都已完成,或者直到饼干都用完为止。 程序让我们举一个例子来说明如何使用双指针技术在 C++ 中分发饼干。 输出 Sorted Greed Factors: 1 2 3 Sorted Cookie Sizes: 1 1 Checking if cookie of size 1 can satisfy child with greed 1. Child with greed 1 is satisfied by cookie of size 1. Checking if cookie of size 1 can satisfy child with greed 2. Cookie of size 1 is too small for child with greed 2. Total content children: 1 Example 1: Greed factors: 1 2 3 Cookies: 1 1 Number of content children: 1 Sorted Greed Factors: 1 2 Sorted Cookie Sizes: 1 2 3 Checking if cookie of size 1 can satisfy child with greed 1. Child with greed 1 is satisfied by cookie of size 1. Checking if cookie of size 2 can satisfy child with greed 2. A child with Greed 2 is satisfied by a cookie of size 2. Total content children: 2 Example 2: Greed factors: 1 2 Cookies: 1 2 3 Number of content children: 2 Sorted Greed Factors: 1 2 3 Sorted Cookie Sizes: 2 Checking if cookie of size 2 can satisfy child with greed 1. Child with greed 1 is satisfied by cookie of size 2. Total content children: 1 Example 3: Greed factors: 1 2 3 Cookies: 2 Number of content children: 1 说明该程序以正确的方式在两个列表之间取得平衡,以使孩子们感到尽可能满意。 1. 输入验证 程序的第一行调用 `validateInputs`。此函数检查 `greedFactors` 和 `cookieSizes` 是否已正确初始化为所有非负值。如果检测到负值,将显示错误消息,并且该函数会提前退出,以防止处理无效数据。此验证步骤对于保持原始数据的完整性以及通过程序执行获得可靠结果至关重要。 2. 排序以实现最佳匹配 之后,在验证输入数据后,将调用主函数 `findContentChildren` 来处理数据。在该函数中,我们首先将 `greedFactors` 和 `cookieSizes` 列表按升序排序。为了实现高效的分配过程,我们将饼干排序,以便最小的饼干分给最不贪婪的孩子,将更大的饼干留给需求更多的孩子。这就是为什么我们需要这种战略性排序来最优地分配饼干。因此,他们将最大化满意孩子的数量。 3. 双指针技术 双指针技术,以及 `childIndex` 和 `cookieIndex`,是解决方案的核心。这些指针遍历 `greedFactors` 和 `cookieSizes`。每次程序进行迭代时,它都会检查 `cookieIndex` 处的饼干是否足以满足 `childIndex` 处孩子的实际贪婪程度需求。只有当满足时,孩子才会高兴,两个指针都会前进,然后移动到下一个孩子和饼干。 这通过 `contentChildren` 属性的计数增量 `contentChildren` 来反映。但是,如果饼干不够,只有 `cookieIndex` 指针会向前移动到该孩子可用的下一个饼干。这确保了饼干得到了有效利用。在饼干中,较小的尺寸会首先被记录下来,以便于跟踪和调试,并降低使用较大尺寸饼干的孩子的贪婪程度。 4. 功能演示 `runExamples` 函数首先通过展示几个测试用例来演示代码的健壮性,每个测试用例都描绘了不同的情况。有许多饼干的案例,有少量饼干的案例,以及贪婪程度恰好与饼干尺寸匹配的案例。 我们使用 `findContentChildren()` 函数运行每个测试用例,并使用 `displayResult()` 函数以结构化的形式打印出结果。这个函数的主要作用是整齐地输出贪婪因子、饼干以及满意孩子的总数。 复杂度分析时间复杂度 时间复杂度可以细分为几个组成部分,反映了算法执行的主要操作。
算法的总运行时间为 O(n log n + m log m)。 空间复杂度 分析空间复杂度涉及评估算法使用的内存。
总空间复杂度仍由输入存储主导:O(n+m) 下一主题C++ 中的 N 叉树镜像 |
在数论中,利赫雷尔数(Lychrel number)是指一个自然数,它通过反转其数字并将其加到原始数字上的重复过程,无法形成一个回文数。如果一个数永远无法成为回文数,那么它就是一个利赫雷尔数……
阅读 4 分钟
在本文中,我们将讨论 C++ 中的 strcat() 函数,包括其语法、参数、操作和示例。什么是 Strcat() 函数? strcat() 是 C++ 中一个基本的字符串操作函数,用于连接两个字符串。语法:它的语法如下:char* strcat(char* destination, const char*...
阅读 4 分钟
在 C++ 中填充每个节点中的右指针 填充二叉树每个节点中的右指针是计算机科学中的一个经典问题,涉及增强树的结构以支持特定类型的遍历和操作。这个问题尤其与...
阅读 17 分钟
FizzBuzz 问题是经典的编码挑战之一,经常用于筛选程序员的编程语言、控制结构和解决问题能力。虽然它看起来很简单,但它将表明我们是否了解基本知识,包括循环、条件...
阅读 6 分钟
? 本主题将讨论如何在 C++ 编程语言中将给定字符串分割成单个单词。当我们.分一组单词或字符串集合时,称为字符串的拆分或分割。然而,拆分字符串是...
5 分钟阅读
在本文中,我们将讨论带它们的,示例,时间复杂度,空间复杂度和应用程序。特殊两位数:满足特定数学要求的数字称为特殊两位数。根据此要求,原始两位数的...值
阅读 4 分钟
简介二叉树是一种分层数据结构,由节点组成,每个节点最多可以有两个子节点:节点必须有一个左子节点和一个右子节点。由于其在表示层级关系方面的卓越性,二叉...
阅读 12 分钟
引言 数字自古以来就引起数学家和程序员的兴趣。几种有趣的数列之一是十一边形数,它们因其几何意义而闻名。这些数字代表一个 11 边形或一个 11 边的图形(十一边形),并且可以被描述为三角形的推广……
阅读 4 分钟
概述 std:text_encoding 函数是 C++ 中相当概念性的功能之一,它包含了不同类型的文本编码。它有助于在其他字符中进行文本的翻译和处理。在处理文本数据时,此函数有助于确保...
5 分钟阅读
Leyland 数是 xy + yx 的一种特殊形式,其中 x 和 y 是大于 1 的整数。这些数字是非平凡且对称的,这意味着 xy + yx = yx + xy。它们在数论中被研究。输入:X = 2,y = 3 输出:2^3 + 3^2 = 8 + 9……
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India