代码随想录第30天 | ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

860.柠檬水找零

/**
 * @param {number[]} bills
 * @return {boolean}
 */
var lemonadeChange = function(bills) {
   let d5=0
   let d10=0
   let d20=0
   for(let i=0;i<bills.length;i++){
       if(bills[i]===5){
           d5+=1
       }
       else if(bills[i]===10){
           if(d5>=1){
                  d5--
                  d10++
               }
             else
                return false
       }
       else
         {
             if(d5>=1&&d10>=1){
                 d5--
                 d10--
             }
             else if(d5>=3){
                 d5-=3
             }
             else 
             return false
         }
          
   }return true
};


406.根据身高重建队列

/**
 * @param {number[][]} people
 * @return {number[][]}
 */
var reconstructQueue = function(people) {
  // people.sort((x,y)=>y[0]-x[0])
    people.sort((a, b ) => {
        if(b[0] !== a[0]) {
            return b[0] - a[0]
        } else {
            return a[1] - b[1]
        }
        
    })
    let ok=[]
    for(let i=0;i<people.length;i++){
          ok.splice(people[i][1],0,people[i]) //纯增加情况
    }
 
   return ok
};

想法

代码随想录第30天 | ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球_第1张图片


困难

 people.sort((a, b ) => {
    if(b[0] !== a[0]) {
        return b[0] - a[0]
    } else {
        return a[1] - b[1]
    }
})

先按升高从大到小排,如果身高一样,就按人数从小到大排队


452. 用最少数量的箭引爆气球

/**
 * @param {number[][]} points
 * @return {number}
 */
var findMinArrowShots = function(points) {
  points.sort((x,y)=>(x[0]-y[0]))
  //按开始节点排序
  let r=0
  for(let i=0;i<points.length-1;i++){
  //有重叠,(两个气球化为一个气球),更新最右边框
   if(points[i][1]>=points[i+1][0]){
      points[i+1][1]=points[i+1][1]>points[i][1]?points[i][1]:points[i+1][1]
   }
  //没有重叠,说明可以射出箭了
  else
      r++
      }
      return r+1
};


想法

局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。代码随想录第30天 | ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球_第2张图片


你可能感兴趣的:(代码随想录,算法,javascript,leetcode)