九章算法面试题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 |
面试官角度
上述的解答是针对如果没有相邻且重复的权重的情况。一般来说,还会再问你如果权重有重复怎么办?此时,我们假设对于相邻重复的权重,分配的糖果数可以相等。那么做法其实只需要在上述算法之前再加上一步去重,在完成糖果分配之后,再把相邻且相同权重的小朋友分配上同样多的糖果即可。相关文章推荐
- 九章算法面试题81 岛屿的个数
- 九章算法面试题4 索引比例
- 九章算法面试题15 字符串编辑距离
- 九章算法面试题29 子矩阵的最大公约数
- 九章算法面试题42 构造MaxTree
- 九章算法面试题55 旋转字符串
- 九章算法面试题82 合并有序链表
- 九章算法面试题5 有序数组合并
- 九章算法面试题31 子数组的最大差
- 九章算法面试题43 直方图内最大矩阵
- 九章算法面试题56 最近公共祖先
- 九章算法面试题83 把0移到数组右边
- 九章算法面试题16 01随机生成函数
- 九章算法面试题57 拷贝带随机指针的链表结构
- lintcode&九章算法——Google 面试题 | 多余的连接 ? 待解决
- 九章算法面试题84 奇偶分割数组
- 九章算法面试题6 负载均衡
- 九章算法面试题17 从输入流中随机取记录
- 九章算法面试题32 小球排序
- 九章算法面试题58 背包问题