1 题目

There are N children standing in a line. Each child is assigned a rating value.

You are giving candies to these children subjected to the following requirements:

  • Each child must have at least one candy.
  • Children with a higher rating get more candies than their neighbors.

What is the minimum candies you must give?

接口

int candy(int[] ratings)
几个小孩站一排,每个小孩有个等级值,现在给小孩发糖,发的时候要遵守2个规则:(1)每个小孩至少一颗糖(2)两个相邻的小孩中,等级大的小孩一定比等级小的小孩糖多,求发糖的数目的最小值。

2 思路

基本思路:先进行2次扫描,一次从左往右,一次从右往左。最后一次扫描累加出结果。
第一次扫描:维护对于每一个小孩左边所需要最少的糖果数量,存入数组对应元素中。
第二次扫描:维护右边所需的最少糖果数。
第三次扫描:将左边和右边大的糖果数量累加到result,从而累加得出结果。
example: ratings = [3,4,5,1,2,3]
 
ratings 3 4 5 1 2 3
lefts 1 2 3 1 2 3
rights 1 1 2 1 1 1
两者最大值 1 2 3 1 2 3
result = sum(1,2,3,1,2,3) = 12

复杂度

方法只需要3次扫描,所以时间复杂度是O(3*n)=O(n)。空间上需要2个长度为n的数组,复杂度是O(n)。

3 代码

     public int candy(int[] ratings) {
final int len = ratings.length;
int[] lefts = new int[len];
int[] rights = new int[len]; // scan from left to right
lefts[0] = 1;
for (int i = 1; i < len; i++) {
if (ratings[i] > ratings[i - 1]) {
lefts[i] = lefts[i - 1] + 1;
} else {
lefts[i] = 1;
}
} // scan from right to left
rights[len - 1] = 1;
for (int i = len - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]) {
rights[i] = rights[i + 1] + 1;
} else {
rights[i] = 1;
}
} // calculate min nums of candy
int result = 0;
for (int i = 0; i < len; i++) {
result += Math.max(lefts[i], rights[i]);
}
return result;
}

4 总结

  • 小朋友分糖,影响因素都是由左右两边的最值来决定的。
  • 这种两边扫描的方法是一种比较常用的技巧,LeetCode中Trapping Rain Water和这道题都用到了,可以把这种方法作为自己思路的一部分,通常是要求的变量跟左右元素有关系的题目会用到。 From Code Ganker
  • code可以将第三次扫描省掉,把第三次扫描的工作放到第二次里面做,现在不推荐做,因为显得结题思路不清晰。

5 扩展

Trapping Rain Water

6 参考

最新文章

  1. 【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目
  2. JS无刷新分页插件
  3. 服务器重写技术:rewrite
  4. MVC Filter自定义异常(拦截)
  5. unlocker208安装之后看不到Apple macos选项,解决办法.
  6. iOS开发讯飞语音的集成
  7. Android 面试题(转)
  8. Redis的启动
  9. 7、Python-引用传递与值传递
  10. vim常用指令整理小结
  11. 拟物设计和Angular的实现 - Material Design
  12. BP神经网络原理详解
  13. netty+proto使用简要记录
  14. 两个list比较相等元素
  15. NEERC2012
  16. 最近玩了一下qt5.2.1,顺着写点东西,关于这个版本设置程序主窗口居中
  17. 面试题思考:Cookie 和 Session的区别
  18. centos set up samba
  19. lvs虚拟服务器
  20. Linux-Mysql8.0

热门文章

  1. Android图片异步加载之Android-Universal-Image-Loader
  2. ajax大数据排队导出+进度条
  3. centos 安装mysqldb 记录
  4. Oracle 特殊字符模糊查询的方法
  5. PHP程序漏洞产生的原因和防范方法
  6. phpstrtotime()对于31日求上个月有问题
  7. Repeater为空时显示“暂无数据”,很方便实用方法
  8. .Net开源SqlServer ORM框架SqlSugar整理
  9. 转--浅谈ETL
  10. AUTOTRACE Statistics常用列解释