您的位置:首页 > 职场人生

九章算法面试题47 分糖果

2015-05-13 01:36 169 查看

九章算法官网-原文网址

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

面试官角度

上述的解答是针对如果没有相邻且重复的权重的情况。一般来说,还会再问你如果权重有重复怎么办?此时,我们假设对于相邻重复的权重,分配的糖果数可以相等。那么做法其实只需要在上述算法之前再加上一步去重,在完成糖果分配之后,再把相邻且相同权重的小朋友分配上同样多的糖果即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: