码迷,mamicode.com
首页 > 编程语言 > 详细

九章算法面试题47 分糖果

时间:2015-05-13 10:30:05      阅读:325      评论:0      收藏:0      [点我收藏+]

标签:贪心   leetcode   lintcode   九章算法   面试题   

九章算法官网-原文网址

http://www.jiuzhang.com/problem/47/


题目

N个孩子站成一排,每个人分给一个权重。按照如下的规则分配糖果:

  1. 每个孩子至少有一个糖果权重较高的孩子,会比他的邻居获得更多的糖果。

问题是,最少需要多少个糖果?



解答

将权重序列想象为股票的涨跌曲线。对于每个波谷,根据贪心的原则,就分给他1颗糖果。从左到右扫描数组,将波谷后面的递增序列每个分配最少能分配的糖果。从右到做扫描一遍做类似的事情,但要同时比较之前的分配,取最大值。

如下表所示权重序列,第一次扫描线找到波谷(满足A[i] < A[i-1] & A[i] < A[i+1]的),每个1均为波谷,标记为分配一颗糖果。

权重

1

3

7

2

1

9

6

2

1

糖果

1




1




1


然后从左到右扫一次,把波谷往后的连续递增序列标记分配的糖果数目也逐个递增。


权重

1

3

7

2

1

9

6

2

1

糖果

1

2

3


1

2



1


接下来从右到左扫描一次,对于每个波谷左边的连续递增序列,逐个标记糖果数目。如果该位置已经标记了糖果数目,则取较大的那个。


权重

1

3

7

2

1

9

6

2

1

糖果

1

2

3

2

1

4

3

2

1



面试官角度

上述的解答是针对如果没有相邻且重复的权重的情况。一般来说,还会再问你如果权重有重复怎么办?此时,我们假设对于相邻重复的权重,分配的糖果数可以相等。那么做法其实只需要在上述算法之前再加上一步去重,在完成糖果分配之后,再把相邻且相同权重的小朋友分配上同样多的糖果即可。



九章算法面试题47 分糖果

标签:贪心   leetcode   lintcode   九章算法   面试题   

原文地址:http://blog.csdn.net/jiuzhang_ninechapter/article/details/45680281

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!