【算法】Candy 分发糖果
文章目录
- Candy 分发糖果
- 问题描述:
- 分析
- 代码
Candy 分发糖果
问题描述:
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到 1 个糖果。
- 相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
n 范围[1,20000]
ratings[i] 范围[1,20000]
分析
r a t i n g rating rating数组表示了每个 c h i l d child child的分数,而且数据范围很大。
在这个数据规模下,对数级的算法时间复杂度应该是勉强可以通过的,而 O ( N 2 ) O(N^2) O(N2)的算法是必然TLE的。
如果用 c [ ] c[] c[]表示分的 c a n d y candy candy数量,要求每个人至少要有1个 c a n d y candy candy,而且另一个条件是当 r a t i n g [ i ] rating[i] rating[i]比它相邻的得分大,那么 i i i就应该分的 c a n d y candy candy是 m a x ( c [ i − 1 ] , c [ i + 1 ] ) + 1 max(c[i-1],c[i+1])+1 max(c[i−1],c[i+1])+1.
同时当 r a t i n g [ i − 1 ] = = r a t i n g [ i ] rating[i-1]==rating[i] rating[i−1]==rating[i]时,分配数量是不受限制的,假如 c [ i − 1 ] = = 100 c[i-1]==100 c[i−1]==100,那么 c [ i ] c[i] c[i]最小可以是 1 1 1。
所以目标就是确定每个 c h i l d child child,可以最少分多少。
数组元素必然是 递增,递减,相等这些情况组合的。
从左到右遍历, 如果 r a t i n g [ i − 1 ] < r a t i n g [ i ] , c [ i ] = c [ i − 1 ] + 1 如果rating[i-1]<rating[i],c[i] = c[i-1]+1 如果rating[i−1]<rating[i],c[i]=c[i−1]+1, 否则 c [ i ] = 1 否则c[i]=1 否则c[i]=1. 这样可以保证 c [ i ] c[i] c[i]相当于其左侧是符合要求的最小。
同样的道理,从右到左遍历, 如果 r a t i n g [ i ] > r a t i n g [ i + 1 ] , c [ i ] = m a x ( c [ i ] , c [ i + 1 ] + 1 ) , 否则 c [ i ] = 1 如果rating[i]>rating[i+1],c[i] =max(c[i], c[i+1]+1),否则c[i]=1 如果rating[i]>rating[i+1],c[i]=max(c[i],c[i+1]+1),否则c[i]=1,因为此时 c c c已经有值,所以 c [ ] c[] c[]的最小值已经确定,但是在从右向左遍历时,可能会导致 c [ ] c[] c[]受右侧影响,要比之前的要大。
2次遍历之后, c [ ] 就是符合最小的分配 c a n d y 数 c[]就是符合最小的分配candy数 c[]就是符合最小的分配candy数。
时间复杂度 O ( N ) O(N) O(N),空间复杂度 O ( N ) O(N) O(N)
还有一个思路是空间O1,但是比较难想,有机会再补吧。
这个问题其实还可以增加点难度,如果数组是循环的,是一个环,如何处理。
代码
public int candy(int[] ratings) {int n = ratings.length;int[] c = new int[n];for (int i = 0; i < n; i++) {if (i > 0 && ratings[i] > ratings[i - 1]) {c[i] = c[i - 1] + 1;} else {c[i] = 1;}} int ans =0;for (int i = n-1; i >=0; i--) {if (i+1 <n && ratings[i+1] < ratings[i]) {c[i] = Math.max(c[i],c[i+1] + 1) ;} else {c[i] = Math.max(c[i],1);}ans += c[i];} return ans; }
时间复杂度 O ( N ) O(N) O(N)
空间复杂度: O ( N ) O(N) O(N)
Tag
Array
greedy
【算法】Candy 分发糖果相关推荐
- 贪心算法-分配问题-分发糖果
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻的孩子中,评分 ...
- Java描述 LeetCode,135. Candy 分发糖果
大家好,我是河海哥,专注于后端,如果可以的话,想做一名code designer而不是普通的coder,一起见证河海哥的成长,您的评论与赞是我的最大动力,如有错误还请不吝赐教,万分感谢.一起支持原创吧 ...
- LeetCode算法题0:分发糖果【贪心算法】
文章目录 前言 一.题目 二.思路详解 三.搞点实际点儿的(C++实现) 1.略显粗糙的代码实现 2.稍显精致的代码实现 3.最终的代码实现 4.提交结果 总结 前言 本文记录自己在LeetCode上 ...
- 通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)
看完本文,可以顺便解决leetcode以下两个题目: 455.分发饼干(简单) 135.分发糖果(困难) 一.通俗易懂的 贪心算法 |思想 贪心算法就是采用贪心的策略,保证每一次的操作都是局部最优的, ...
- 【LeetCode】贪心算法--分发糖果(135)
今日题目 老师想给孩子们分发糖果,有N个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果.相邻的孩子中, ...
- LeetCode135. 分发糖果(贪心算法)
1 题目描述 n 个孩子站成一排.给你一个整数数组 ratings 表示每个孩子的评分. 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻两个孩子评分更高的孩子会获得更 ...
- 135. 分发糖果(贪心算法)
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 评分更高的孩子必须 ...
- 135. 分发糖果002(贪心算法+思路+详解)
一:题目 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 评分更高 ...
- LeetCode 135. 分发糖果(贪心算法)
题目描述 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻的孩 ...
最新文章
- Python matplotlib 绘制等高线图
- wxWidgets编程笔记二(samples使用设置)
- 四种python 单继承的实现方式
- 2021年,戴尔的显示器竟然出现了弹出式摄像头
- Hive 01_初学必知
- VMware下安装CentOS7 无法通过桥接模式进行联网
- java值参_JAVA赋值和传参理解
- PRML-系列一之1.1
- CSMA协议:改进的ALOHA协议
- linux NVMe驱动总结
- Matlab - Matlab 2016a 安装破解教程
- CentOS7|Redhat7挂载NTFS格式磁盘
- JAVA泛型_泛型类、接口、通配符、方法、上下边界
- html上下两个箭头符号怎么打出来,上下两个半箭头符号怎么打啊?高手进来看下,有图示的!...
- 数学基础知识02——旋转轴、旋转角度和旋转矩阵
- Java进阶_3 注解、APT
- 3dmax中的纹理材质有什么用
- 【2022/2023年硕士研究生408计算机学科考试大纲原文】+【2009-2021年408统考真题+解析PDF】
- z=z(x,y)中面积积分和方向余弦
- python游戏开发框架_Python游戏开发:数字华容道