力扣算法题 ----分发糖果 js解法

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

示例 1:

输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
示例 2:

输入:ratings = [1,2,2]
输出:4
解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。
     第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。

function(ratings) {
    let obj = []
      for (let i = 0; i < ratings.length; i++) {
        const o = {
          name: ratings[i],
          add: false,
          num: 1,
        }
        obj.push(o)
      }
      for (let j = 0; j < obj.length; j++) {
        if (j < obj.length - 1) {
          if (obj[j].name < obj[j + 1].name &&obj[j + 1].num<=obj[j].num) {
                  obj[j + 1].num=obj[j].num+1
          }
        }
      }
      obj = obj.reverse()
      for (let j = 0; j < obj.length; j++) {
        if (j < obj.length - 1) {
          if (obj[j].name < obj[j + 1].name  && obj[j + 1].num<=obj[j].num) {
           obj[j + 1].num=obj[j].num+1
          }
        }
      }
      let sum = 0
      sum = obj.reduce((total, item) => {
        return total + item.num
      }, 0)

      return sum
};

解法二:

function(ratings) {
    let count=new Array(ratings.length).fill(1)
    for(let i=1;iratings[i-1]){
            count[i]=count[i-1]+1
        }
    }
    for(let i=ratings.length-2;i>=0;i--){
        if(ratings[i]>ratings[i+1]){
            count[i]=Math.max(count[i],count[i+1]+1)
        }
    }
    let sum = count.reduce((total,item)=>{
        return total+item
    })
    return sum
};

你可能感兴趣的:(算法题,前端)