九章算法面试题47 分糖果

九章算法官网-原文网址

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



面试官角度

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值