当前位置: 首页 > news >正文

Python面试宝典第23题:分发糖果

题目

        n 个孩子站成一排,给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果。

        (1)每个孩子至少分配到 1 个糖果。

        (2)相邻两个孩子评分更高的孩子会获得更多的糖果。

        请你给每个孩子分发糖果,计算并返回需要准备的最少糖果数目 。

        示例 1:

输入:ratings = [1, 0, 2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发2、1、2颗糖果。

        示例 2:

输入:ratings = [1, 2, 2]
输出:4
解释:你可以分别给第一个、第二个、第三个孩子分发1、2、1颗糖果。
第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。

贪心算法

        本题最直观的解法是:使用两次遍历的贪心算法。第一次遍历:从左到右,保证每个孩子至少有一颗糖果,并且如果当前孩子评分比左边孩子高,则当前孩子至少比左边孩子多一颗糖果。第二次遍历:从右到左,再次检查每个孩子,确保如果当前孩子评分比右边孩子高,也能得到比右边孩子多的糖果。使用贪心算法求解本题的主要步骤如下。

        1、初始化一个结果数组,每个位置初始化为1,表示每个孩子至少有一颗糖果。

        2、从左到右遍历,如果当前孩子的评分比前一个孩子高,则在结果数组中,当前孩子的糖果数比前一个孩子多1。

        3、从右到左遍历,重复步骤2的逻辑,这样可以确保每个孩子根据其两边的比较都能得到正确的糖果数。

        4、计算结果数组中所有糖果数的总和。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def distribute_candies_greedy(ratings):n = len(ratings)if n == 0:return 0# 初始化糖果数组,每个孩子至少一个糖果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] and candies[i] <= candies[i+1]:candies[i] = candies[i+1] + 1# 计算总糖果数return sum(candies)ratings = [1, 0, 2]
print(distribute_candies_greedy(ratings))ratings = [1, 2, 2]
print(distribute_candies_greedy(ratings))

总结

        贪心算法的核心思想是在每一步选择中都采取在当前看来最好的策略,期望通过一系列局部最优的选择达到全局最优解。本题通过两次遍历保证了所有相邻孩子之间的糖果分配满足题目要求,是一种典型的贪心策略应用。

        贪心算法的时间复杂度是O(n),其中n是孩子的数量。这是因为算法执行了两次遍历数组的操作。第一次从左到右遍历,第二次从右到左遍历。尽管是两次遍历,但每次遍历都是线性的,所以总的时间复杂度仍然是线性的。其空间复杂度也为O(n),主要是由于存储每个孩子分配的糖果数需要额外的空间。

http://www.lryc.cn/news/410589.html

相关文章:

  • Java与模式及其应用场景知识点分享(电子版)
  • 软考高级第四版备考--第36天(审计内容)
  • 文件IO相关作业
  • vue3 watch监听 父子组件通信
  • 【信创】adduser与useradd的区别 _ 统信 _ 麒麟 _ 中科方德
  • 微软Win11 24H2最新可选更新补丁26100.1301来袭!
  • 层次特征的尺度艺术:sklearn中的缩放技术
  • Chapter 21 深入理解JSON
  • 【C++高阶数据结构】红黑树:全面剖析与深度学习
  • 前端基于 axios 实现批量任务调度管理器 demo
  • Docker容器下面home assistant忘记账号密码怎么重置?
  • CTF-NSSCTF[GKCTF 2021]
  • MSA+抑郁症模型总结(一)(论文复现)
  • STM32智能农业灌溉系统教程
  • MySQL存储引擎和
  • Eclipse 主网向开发者开放
  • 国内NAT服务器docker方式搭建rustdesk服务
  • 锅总浅析链路追踪技术
  • 为什么阿里开发手册不建议使用Date类?
  • 中间层 k8s(Kubernetes) 到底是什么,架构是怎么样的?
  • 【CTFWP】ctfshow-web40
  • 项目实战1(30小时精通C++和外挂实战)
  • 百日筑基第三十六天
  • MySQL: ALTER
  • 微前端技术预研 - bit初体验
  • 对象关系映射---ORM
  • Django REST Framework(十七)Authentication
  • FPGA开发——数码管的使用
  • 什么是网络安全等级保护测评服务?
  • 基于深度学习的多模态情感分析