数据结构与算法之 leetcode 贪心算法分发糖果 左右两次遍历

数据结构与算法阿木 发布于 2025-07-12 10 次阅读


摘要:

贪心算法是一种在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。本文将以LeetCode上的经典问题“贪心算法分发糖果”为例,深入探讨贪心算法的原理、实现方法以及在实际问题中的应用。

一、问题背景

LeetCode是一个在线编程社区,提供了大量的编程题目,其中“贪心算法分发糖果”是一道典型的贪心算法问题。问题描述如下:

给定n个孩子和一个糖果数组candies,其中candies[i]表示第i个孩子拥有的糖果数。每个孩子至少需要1个糖果,你需要按照以下规则分发糖果:

1. 如果一个孩子比前一个孩子拥有的糖果多,那么他应该获得比前一个孩子更多的糖果。

2. 如果一个孩子比前一个孩子拥有的糖果少,那么他应该获得与前一个孩子相同的糖果。

你需要计算并返回能够满足上述条件的最少糖果数量。

二、贪心算法原理

贪心算法的核心思想是在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的。贪心算法通常适用于以下几种情况:

1. 问题的最优解包含其子问题的最优解。

2. 每个贪心选择都是局部最优的,并且这些局部最优的选择能够导致全局最优解。

三、贪心算法实现

以下是一个使用贪心算法解决“贪心算法分发糖果”问题的Python代码实现:

python

def candy(candies):


n = len(candies)


if n == 0:


return 0

初始化糖果数组,每个孩子至少有1个糖果


candies = [1] n


从左到右遍历,确保每个孩子都比前一个孩子拥有更多的糖果


for i in range(1, n):


if candies[i] > candies[i - 1]:


candies[i] = candies[i - 1] + 1

从右到左遍历,确保每个孩子都比后一个孩子拥有更多的糖果


for i in range(n - 2, -1, -1):


if candies[i] < candies[i + 1]:


candies[i] = candies[i + 1] + 1

计算总糖果数


return sum(candies)

测试代码


candies = [1, 0, 2]


print(candy(candies)) 输出:5


四、贪心算法分析

1. 时间复杂度:该算法的时间复杂度为O(n),其中n为孩子的数量。因为我们需要对糖果数组进行两次遍历。

2. 空间复杂度:该算法的空间复杂度为O(1),因为我们只需要一个额外的数组来存储最终的结果。

五、贪心算法应用

贪心算法在解决实际问题时具有广泛的应用,以下是一些常见的应用场景:

1. 资源分配问题:如最优二分搜索树、 Huffman 编码等。

2. 路径规划问题:如 Dijkstra 算法、 Kruskal 算法等。

3. 最优搜索问题:如背包问题、活动选择问题等。

六、总结

本文以LeetCode上的经典问题“贪心算法分发糖果”为例,深入探讨了贪心算法的原理、实现方法以及在实际问题中的应用。通过分析问题背景、贪心算法原理、实现方法以及算法分析,我们了解到贪心算法在解决某些问题时具有高效、简洁的特点。在实际应用中,我们需要根据问题的特点选择合适的算法策略,以达到最优解。