Skip to content

Instantly share code, notes, and snippets.

@oldratlee
Last active December 24, 2015 18:49
Show Gist options
  • Save oldratlee/6845437 to your computer and use it in GitHub Desktop.
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
/** 通过的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