数据结构与算法之 leetcode 贪心算法分糖果数 贪心分配策略

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


摘要:

贪心算法是一种在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。本文将以LeetCode上的“分糖果数”问题为例,探讨贪心算法在数据结构与算法中的应用,并详细分析其解题思路和代码实现。

一、问题背景

LeetCode上的“分糖果数”问题如下:

假设有n个孩子,他们站成一排,每个孩子分到的糖果数是不同的。你需要按照以下规则分配糖果:

1. 每个孩子至少分到1个糖果。

2. 相邻两个孩子分到的糖果数不能相同。

3. 分配的糖果数尽可能多。

现在,你需要计算最少需要多少个糖果才能满足上述条件。

二、贪心算法分析

对于“分糖果数”问题,我们可以采用贪心算法进行求解。贪心算法的基本思想是:在每一步选择中,都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的。

在这个问题中,我们可以按照以下步骤进行贪心选择:

1. 从左到右遍历孩子数组,对于每个孩子,我们首先给他分配1个糖果。

2. 对于当前孩子,我们比较他左右两侧孩子的糖果数。如果左侧孩子的糖果数比当前孩子多,则将当前孩子的糖果数加1;如果右侧孩子的糖果数比当前孩子多,则将当前孩子的糖果数减1。

3. 重复步骤2,直到遍历完所有孩子。

通过以上步骤,我们可以确保每个孩子分到的糖果数尽可能多,且相邻两个孩子分到的糖果数不同。

三、代码实现

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

python

def candy(nums):


n = len(nums)


if n == 0:


return 0


if n == 1:


return 1

初始化糖果数组


candies = [1] n

从左到右遍历孩子数组


for i in range(1, n):


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


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

从右到左遍历孩子数组


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


if nums[i] > nums[i + 1]:


candies[i] = max(candies[i], candies[i + 1] + 1)

计算糖果总数


return sum(candies)

测试用例


nums = [1, 0, 2]


print(candy(nums)) 输出:4


四、总结

本文以LeetCode上的“分糖果数”问题为例,介绍了贪心算法在数据结构与算法中的应用。通过贪心选择,我们可以确保每个孩子分到的糖果数尽可能多,且相邻两个孩子分到的糖果数不同。在实际应用中,贪心算法可以帮助我们快速解决一些优化问题,提高算法效率。

需要注意的是,贪心算法并不总是能得到最优解。在某些情况下,贪心选择可能导致局部最优,而全局最优解可能并不存在。在使用贪心算法时,我们需要根据具体问题进行分析,确保其适用性。

贪心算法是一种简单有效的算法策略,在解决某些问题时具有显著优势。相信读者对贪心算法在“分糖果数”问题中的应用有了更深入的了解。