Last active
December 24, 2015 18:49
-
-
Save oldratlee/6845437 to your computer and use it in GitHub Desktop.
陈利人微博题的实现代码:http://weibo.com/1915548291/AcqqPxnEp #面试题#N个孩子站成一排,每个人分给一个权重。按照如下的规则分配糖果: 每个孩子至少有一个糖果;所分配权重较高的孩子,会比他的邻居获得更多的糖果。 问题是,最少需要多少个糖果?关注微信公众账号“待字闺中”,了解更多。 http://oj.leetcode.com/problems/candy/。 PS: 现在代码移到了 https://github.com/oldratlee/leetcode/blob/master/src/main/java/candy/Solution.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** 通过的UT Case: | |
assertEquals(0, Candy.calcCandyCount(new int[]{})); | |
assertEquals(1, Candy.calcCandyCount(new int[]{1,})); | |
assertEquals(1, Candy.calcCandyCount(new int[]{100,})); | |
assertEquals(2, Candy.calcCandyCount(new int[]{1, 1,})); | |
assertEquals(3, Candy.calcCandyCount(new int[]{1, 2,})); | |
assertEquals(3, Candy.calcCandyCount(new int[]{2, 1,})); | |
assertEquals(3, Candy.calcCandyCount(new int[]{1, 1, 1})); | |
assertEquals(4, Candy.calcCandyCount(new int[]{1, 1, 2})); | |
assertEquals(4, Candy.calcCandyCount(new int[]{2, 1, 1})); | |
assertEquals(4, Candy.calcCandyCount(new int[]{2, 2, 1})); | |
assertEquals(5, Candy.calcCandyCount(new int[]{2, 1, 2})); | |
assertEquals(6, Candy.calcCandyCount(new int[]{1, 2, 3})); | |
assertEquals(6, Candy.calcCandyCount(new int[]{3, 2, 1})); | |
assertEquals(4, Candy.calcCandyCount(new int[]{1, 2, 1})); | |
assertEquals(7, Candy.calcCandyCount(new int[]{1, 2, 3, 3})); | |
assertEquals(9, Candy.calcCandyCount(new int[]{1, 2, 3, 3, 1})); | |
assertEquals(10, Candy.calcCandyCount(new int[]{1, 2, 3, 3, 3, 1})); | |
*/ | |
import java.util.ArrayList; | |
import java.util.List; | |
/** | |
* @author ding.lid | |
*/ | |
public class Candy { | |
private static class UndulationInfo { | |
public UndulationInfo(int adjust, int upLen, int downLen) { | |
this.adjust = adjust; | |
this.upLen = upLen; | |
this.downLen = downLen; | |
} | |
public int adjust; | |
public int upLen; | |
public int downLen; | |
} | |
public static int calcCandyCount(int[] weights) { | |
final int length = weights.length; | |
int adjust = 0; | |
List<UndulationInfo> infoList = new ArrayList<UndulationInfo>(); | |
for (int i = 0; i < length; ) { | |
int up = 0; | |
int down = 0; | |
while (i + 1 < length && weights[i + 1] > weights[i]) { | |
++up; | |
++i; | |
} | |
while (i + 1 < length && weights[i + 1] < weights[i]) { | |
++down; | |
++i; | |
} | |
infoList.add(new UndulationInfo(adjust, up, down)); | |
if (i == length - 1) break; | |
if (weights[i + 1] == weights[i]) { | |
adjust = 0; // 如果相等,新起一个没有起点重合的山坡 | |
++i; | |
} else { | |
adjust = -1; // 如果不相等(实际上是重新上坡),新起一个起点重合的山坡。校正值为-1 | |
} | |
} | |
return calcFromUndulationInfo(infoList); | |
} | |
private static int calcFromUndulationInfo(List<UndulationInfo> infoList) { | |
int count = 0; | |
for (UndulationInfo info : infoList) { | |
count += info.adjust // 校正值 | |
+ info.upLen * (info.upLen + 1) / 2 // 上升坡的和 | |
+ info.downLen * (info.downLen + 1) / 2 // 下降坡的和 | |
+ Math.max(info.upLen, info.downLen) + 1; // 坡顶的值 | |
} | |
return count; | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment