标签:贪心 leetcode lintcode 九章算法 面试题
http://www.jiuzhang.com/problem/47/
N个孩子站成一排,每个人分给一个权重。按照如下的规则分配糖果:
每个孩子至少有一个糖果权重较高的孩子,会比他的邻居获得更多的糖果。
问题是,最少需要多少个糖果?
将权重序列想象为股票的涨跌曲线。对于每个波谷,根据贪心的原则,就分给他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 |
上述的解答是针对如果没有相邻且重复的权重的情况。一般来说,还会再问你如果权重有重复怎么办?此时,我们假设对于相邻重复的权重,分配的糖果数可以相等。那么做法其实只需要在上述算法之前再加上一步去重,在完成糖果分配之后,再把相邻且相同权重的小朋友分配上同样多的糖果即可。
标签:贪心 leetcode lintcode 九章算法 面试题
原文地址:http://blog.csdn.net/jiuzhang_ninechapter/article/details/45680281