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

【LeetCode】分发糖果 解题报告

135. 分发糖果 - 题目链接

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

  • 每个孩子至少分配到1个糖果。
  • 相邻两个孩子评分更高的孩子会获得更多的糖果。

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

示例 1:

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

示例 2:

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

提示:

  • n = = r a t i n g s . l e n g t h n == ratings.length n==ratings.length
  • 1 < = n < = 2 ∗ 1 0 4 1 <= n <= 2 * 10^4 1<=n<=2104
  • 0 < = r a t i n g s [ i ] < = 2 ∗ 1 0 4 0 <= ratings[i] <= 2 * 10^4 0<=ratings[i]<=2104

说实话这题能评红我是没想到的,感觉最多黄。
题意很简单,大概就是给一排孩子的评分,让你按评分发糖,每人最少拿 1 1 1 颗,评分高的要比评分低的多,一样或者更少可以只发一颗。甚至没有让孩子们站成一个圈,而是一条首尾不相连的队伍。
我的思路是开一个数组 C a n d y Candy Candy存放每个孩子分到的糖,方便后续处理,初始化给数组每个元素赋值为 1 1 1。然后先从左往右遍历,每次只比较当前孩子和其左边孩子的评分,更高则糖果比左边 + 1 +1 +1,否则置为 1 1 1。当然这样肯定是不完整的,所以还需从右往左再遍历一次,这次处理需要同时比较每一个孩子两边的孩子的评分,并作相应处理,最后再特判 0 0 0号位的孩子。
虽说实际上自己也是靠着数据调了几次才做出来的,不过整体上来说实现思路并不难。
完整代码如下,附注释:

class Solution {
public:
    int candy(vector<int>& ratings) {
		int n = ratings.size();//孩子数
		if (n < 2)return 1;//n==1时特判
		if (n == 2)return ratings[0] == ratings[1] ? 2 : 3;//n==2时特判
		vector<int>Candy(n, 1);//初始化糖果,每个人至少分到1个
		for (int i = 1; i < n; ++i) {//从左往右遍历
			if (ratings[i] > ratings[i - 1])Candy[i] = max(Candy[i], Candy[i - 1] + 1);
			//若当前位置的孩子评分比左边的高,则比左边多分到一个糖果
			else Candy[i] = 1;//若评分更低,则只给一颗糖
		}
		for (int i = n - 1; i > 1; --i) {//从右往左遍历,依次处理当前位置的左边一个孩子
			if (ratings[i] < ratings[i - 1]) {//若当前位置的孩子评分比左边的更低
				if (ratings[i - 1] <= ratings[i - 2])Candy[i - 1] = max(Candy[i - 1], Candy[i] + 1);
				//且左边的孩子评分比左边的左边孩子更低,则该孩子分到的糖为max(自己已分得的,当前位置孩子分得的+1)
				else Candy[i - 1] = max(Candy[i - 1], max(Candy[i - 2] + 1, Candy[i] + 1));
				//否则左边的孩子比两边孩子评分都高,则取两边孩子分得糖果数多的再加一
			}
		}
		if (ratings[0] > ratings[1])Candy[0] = max(Candy[0], Candy[1] + 1);//特殊处理第0号孩子
		int tot = 0;
		for (int i = 0; i < n; ++i)
			tot += Candy[i];//统计所有糖果数
		return tot;
    }
};

完整代码也可看我的Github:传送门

复杂度
最终结果是用空间换时间了,不过也还算可以。
看了一下官方题解,我的思路似乎和官方的解差不多,还是不错的。


总之就是个不算太难的数组模拟题吧,主要还是看实现思路,因为是红题所以搞了篇博客写。
以上。


http://www.kler.cn/a/388867.html

相关文章:

  • 32位、64位、x86与x64:深入解析计算机架构
  • 【Webpack实用指南】如何拆分CSS资源(2)
  • vue3+element-plus==> el-form输入响应式失效踩坑!!!!!!!!!!
  • 阿里巴巴通义灵码推出Lingma SWE-GPT:开源模型的性能新标杆
  • Ollama的安装以及大模型下载教程
  • 如何为电子课程创造创意
  • O-RAN简介
  • 【数学二】线性代数-线性方程组-齐次线性方程组、非齐次线性方程组
  • python的学习
  • 深度学习-神经网络基础-网络搭建-损失函数-网络优化-正则化方法
  • Ubuntu 20.04安装ROS noetic
  • 产品经理晋级-Axure中继器制作美观表格
  • 线上问题的排查之内存溢出(OOM)问题如何排查
  • 09 Oracle数据拯救:Flashback Technologies精细级数据恢复指南
  • Spring Boot 3中基于纯MyBatis的CURD开发实例
  • 嵌入式采集网关(golang版本)
  • CSS的综合应用例子(网页制作)
  • vue系列=状态管理=Pinia使用
  • 【STM32笔记】定时器(TIM1)无法工作
  • 网关 Spring Cloud Gateway
  • Hive的远程模式
  • lua入门教程:随机数
  • c++-有关计数、双变量累加、半衰、阶乘、变量值互换的基础知识
  • 架构篇(05理解架构的服务演化)
  • Ubuntu24.04安装Perforce服务
  • 力扣11.7