题解 | #分糖果问题#

分糖果问题

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,
};

全部评论

相关推荐

03-28 19:11
铜陵学院 C++
有礼貌的山羊追赶太阳:太典了,连笔试都没有开始就因为HC满了而结束了,而且还卡你不让你再投其他部门的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务