题解 | #分糖果问题#
分糖果问题
http://www.nowcoder.com/practice/76039109dd0b47e994c08d8319faa352
思路:将得分情况绘制成折线图,谷底皆为1,然后从谷底往上增糖果数,连续两个数增加+1,连续三个+1+2...以此类推。上坡需要记录峰值 ,然后下降时比较峰值和下降所需要的最高点值,所需要最高点值就是下降个数+1,当峰值大于等于所需要最高值时,只需要增加原本个数-1的总增加值,否则要增加原本个数-1的总增加值再加上所需要最高值 - 峰值。最要注意的是平行,当遇到平行时先进行计算然后将峰值置为1
/**
* pick candy
* @param arr int整型一维数组 the array
* @return int整型
*/
function candy(arr) {
// write code here
let l = arr.length;
let p = 0; //遍历
let sum = l; //初始化为每个节点1个糖果
let top = 1; //初始化峰值
let upsum = 0; //上升个数
let downsum = 0; //下降个数
while (p < l - 1) { //循环遍历
//上升
if (arr[p] < arr[p + 1]) {
if (downsum > 0) {
//谷底 比较峰值
if (top >= downsum + 1) {
sum += ((downsum - 1) * downsum) / 2;
downsum = 0;
top = 1;
} else {
sum += ((downsum - 1) * downsum) / 2 + downsum + 1 - top;
downsum = 0;
top = 1;
}
}
top++;
upsum++;
} else if (arr[p] > arr[p + 1]) {
//下降
if (upsum > 0) {
//顶峰
sum += ((1 + upsum) * upsum) / 2;
upsum = 0;
}
downsum++;
} else {
//遇到平行 先加值 后重置top值
if (downsum > 0) {
//谷底 比较峰值
if (top >= downsum + 1) {
sum += ((downsum - 1) * downsum) / 2;
} else {
sum += ((downsum - 1) * downsum) / 2 + downsum + 1 - top;
}
downsum = 0;
}else if (upsum > 0) {
//顶峰
sum += ((1 + upsum) * upsum) / 2;
upsum = 0;
}
top = 1;
}
p++;
}
//最后需要对最后未结算的进行结算
if (downsum > 0) {
if (top >= downsum + 1) {
sum += ((downsum - 1) * downsum) / 2;
} else {
sum += ((downsum - 1) * downsum) / 2 + downsum + 1 - top;
}
} else if (upsum > 0) {
sum += ((1 + upsum) * upsum) / 2;
}
return sum;
}
module.exports = {
candy: candy,
};