【今日头条】面试题-最少分配糖块问题

这篇博客探讨了在面试中常见的算法题——最少分配糖块问题。文章提供了两种解决方案,分别是方法1和方法2,它们的时间复杂度都是O(N^2)。通过具体的例子,如不同分数对应的糖果数分配,解释了解题思路,如分数为[80, 90, 99, 80, 70]时,糖果数为[1, 2, 3, 2, 1],总糖果数为9,展示了如何确保公平分配的同时尽量减少总的糖果数量。" 138564195,9078080,C/C++ 实现快速傅里叶变换(FFT)算法详解,"['算法', 'C语言', 'C++', '数据结构', '信号处理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 分配最少糖果问题
 * 2021-02-23 20:00-21:30 头条一面
 * 只有一个算法题目,现场紧张,有些bug没有调试出来。
 * ---------------------------------------------
 * 题目介绍:
 * 你是学校老师, 有n个学生; 某次考试后, 你让n个学生排成一排,
 * 按照他们的分数来给予奖励; 奖励为发送糖果, 每个孩子至少会得到一个糖果;
 * 另外如果某个孩子发现他的分数比相邻同学分数高, 但是糖果却不比他们多,
 * 便会不开心;你需要用最少的糖果来让所有孩子都开心;
 * example1: 分数为 80 90 99 80 70:
 * 那糖果最少给1+2+3+2+1 = 9
 * example2: 分数为[80,90,99,100,90,80,81]
 * 糖果: [1,2,3,4,2,1,2]; 总数15
 * example3:[80,0,100]
 * 糖果:[2,1,2], 总数5
 * example3:[80, 90, 99, 99, 99, 100, 90, 80, 88,88]
 * 糖果:[1, 2, 3, 3, 3, 4, 2, 1, 2, 2]; 总数23
 * ---------------------------------------------
 * 思路分析:
 * S1: 创建数组nums,存储每个学生分配的糖果数,均初始化1,保证每个学生至少一块糖果;
 * S2: 从左向右遍历:
 *     if nums[i+1]>nums[i], nums[i+1] = nums[i]+1;
 *     else if nums[i+1]==nums[i],nums[i+1] = nums[i];
 * S3: 从右向左遍历:
 *     if nums[i]>nums[i+1], nums[i] = nums[i+1]+1;
 *     
### 贪心算法实现基于评分数组分配最少糖果 为了满足题目需求,可以采用一种贪心策略来解决问题。假设有一个长度为 n 的孩子评分数组 `ratings`,目标是最少分发多少颗糖果给这些孩子,使得每个孩子的糖果数至少为 1,并且如果某个孩子的评分高于其相邻的孩子,则该孩子获得的糖果也应多于其邻居。 以下是具体方法: #### 方法描述 通过两次遍历完成糖果分配: 1. **正向遍历**:从左到右扫描数组,当右边孩子的评分大于左边时,增加右边孩子的糖果数量。 2. **反向遍历**:从右到左再次调整糖果数量,确保当前孩子的糖果不仅满足左侧条件还满足右侧条件。 这种方法的时间复杂度为 O(n),空间复杂度也为 O(n)[^1]。 #### 实现代码 下面是一个 Python 版本的具体实现: ```python def distributeCandies(ratings): n = len(ratings) candies = [1] * n # 正向遍历 for i in range(1, n): if ratings[i] > ratings[i - 1]: candies[i] = candies[i - 1] + 1 # 反向遍历 for i in range(n - 2, -1, -1): if ratings[i] > ratings[i + 1]: candies[i] = max(candies[i], candies[i + 1] + 1) return sum(candies), candies ``` 此函数返回两个值:第一个是所需总糖果的数量;第二个则是对应每位学生的糖果数目列表[^2]。 例如对于输入 `[1,0,2]` ,上述程序会输出 `(5,[2,1,2])` 表明总共需要发放五颗糖,其中第一位学生两颗、第二位一颗以及第三位也是两颗。 #### 结果验证与分析 以上述例子为例解释结果合理性: - 学生 A (评分为1): 高于B所以应该得到更多糖果 -> 至少有2颗; - 学生 B (评分为0): 不管怎样都只需1颗即可; - 学生 C (评分为2): 大于A因此也需要超过A所拥有的量即>=3但是由于前面已经给了他足够的奖励故最终仍保持原样不变。 综上所述,这种做法能够有效保证公平性和最小化原则的同时达到最优解法之一[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值