文章目录

  • 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 分发糖果相关推荐

  1. 贪心算法-分配问题-分发糖果

    老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻的孩子中,评分 ...

  2. Java描述 LeetCode,135. Candy 分发糖果

    大家好,我是河海哥,专注于后端,如果可以的话,想做一名code designer而不是普通的coder,一起见证河海哥的成长,您的评论与赞是我的最大动力,如有错误还请不吝赐教,万分感谢.一起支持原创吧 ...

  3. LeetCode算法题0:分发糖果【贪心算法】

    文章目录 前言 一.题目 二.思路详解 三.搞点实际点儿的(C++实现) 1.略显粗糙的代码实现 2.稍显精致的代码实现 3.最终的代码实现 4.提交结果 总结 前言 本文记录自己在LeetCode上 ...

  4. 通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)

    看完本文,可以顺便解决leetcode以下两个题目: 455.分发饼干(简单) 135.分发糖果(困难) 一.通俗易懂的 贪心算法 |思想 贪心算法就是采用贪心的策略,保证每一次的操作都是局部最优的, ...

  5. 【LeetCode】贪心算法--分发糖果(135)

    今日题目 老师想给孩子们分发糖果,有N个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果.相邻的孩子中, ...

  6. LeetCode135. 分发糖果(贪心算法)

    1 题目描述 n 个孩子站成一排.给你一个整数数组 ratings 表示每个孩子的评分. 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻两个孩子评分更高的孩子会获得更 ...

  7. 135. 分发糖果(贪心算法)

    老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 评分更高的孩子必须 ...

  8. 135. 分发糖果002(贪心算法+思路+详解)

    一:题目 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 评分更高 ...

  9. LeetCode 135. 分发糖果(贪心算法)

    题目描述 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻的孩 ...

最新文章

  1. Python matplotlib 绘制等高线图
  2. wxWidgets编程笔记二(samples使用设置)
  3. 四种python 单继承的实现方式
  4. 2021年,戴尔的显示器竟然出现了弹出式摄像头
  5. Hive 01_初学必知
  6. VMware下安装CentOS7 无法通过桥接模式进行联网
  7. java值参_JAVA赋值和传参理解
  8. PRML-系列一之1.1
  9. CSMA协议:改进的ALOHA协议
  10. linux NVMe驱动总结
  11. Matlab - Matlab 2016a 安装破解教程
  12. CentOS7|Redhat7挂载NTFS格式磁盘
  13. JAVA泛型_泛型类、接口、通配符、方法、上下边界
  14. html上下两个箭头符号怎么打出来,上下两个半箭头符号怎么打啊?高手进来看下,有图示的!...
  15. 数学基础知识02——旋转轴、旋转角度和旋转矩阵
  16. Java进阶_3 注解、APT
  17. 3dmax中的纹理材质有什么用
  18. 【2022/2023年硕士研究生408计算机学科考试大纲原文】+【2009-2021年408统考真题+解析PDF】
  19. z=z(x,y)中面积积分和方向余弦
  20. python游戏开发框架_Python游戏开发:数字华容道

热门文章

  1. godoc web帮助文档
  2. HTML5网页设计基础——图文混排升级版
  3. CUCM实现黑名单功能
  4. Thymeleaf实例页面范例
  5. 阿里全球首发商业操作系统
  6. 电商对接使用圆通电子面单接口方法
  7. Qt利用布局,widget和ScrollArea实现抽屉效果
  8. 北京大兴国际机场首家麦当劳开业
  9. c语言 错排公式 程序,错排公式的推导及应用
  10. CCF认证考试历年1、2题AC代码