第八章 贪心算法 part04(● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球 )

学习目标:

● 860.柠檬水找零
● 406.根据身高重建队列
● 452. 用最少数量的箭引爆气球


学习内容:● 860.柠檬水找零

https://programmercarl.com/0860.%E6%9F%A0%E6%AA%AC%E6%B0%B4%E6%89%BE%E9%9B%B6.html
注意这个是按顺序遍历,就可以,5,10,15三个数字
有如下三种情况:
情况一:账单是5,直接收下。
情况二:账单是10,消耗一个5,增加一个10
情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5

five-=3//five-3报错
var lemonadeChange = function(bills) {
    let five = 0;
    let ten = 0;
    let twenty = 0;
    for(let i=0;i<bills.length;i++){
        if(bills[i]==5){
            five++
        }
        if(bills[i]==10){
            if(five>=1){
            ten++;
            five--
            }else{
                return false
            }
           
        }
        if(bills[i]==20){
            if(ten>=1&&five>=1){
                twenty++;
                ten--
                five--
            }else if(five>=3){
                five-=3
            }else{
                return false
            }
        }
    }
    return true
};

学习内容:● 406.根据身高重建队列

https://programmercarl.com/0406.%E6%A0%B9%E6%8D%AE%E8%BA%AB%E9%AB%98%E9%87%8D%E5%BB%BA%E9%98%9F%E5%88%97.html

//二维数组的排序
 people.sort((a,b)=>{
        if(a[0]!==b[0]){
            return b[0]-a[0]
        }else{
            return a[1]-b[1]
        }
    })
 //splice向数组指定位置插入元素。三个参数,第一个参数(位置),第二个参数(0),第三个参数(插入的项)
  queue.splice(people[i][1],0,people[i])
var reconstructQueue = function(people) {
    let queue = []
    people.sort((a,b)=>{
        if(a[0]!==b[0]){
            return b[0]-a[0]
        }else{
            return a[1]-b[1]
        }
    })
    for(let i=0;i<people.length;i++){
        queue.splice(people[i][1],0,people[i])
    }
    return queue
};

学习内容:● 452. 用最少数量的箭引爆气球

https://programmercarl.com/0452.%E7%94%A8%E6%9C%80%E5%B0%91%E6%95%B0%E9%87%8F%E7%9A%84%E7%AE%AD%E5%BC%95%E7%88%86%E6%B0%94%E7%90%83.html
为了让气球尽可能的重叠,需要对数组进行排序。
如果气球重叠了,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭。

算法题,永远读不懂题
var findMinArrowShots = function(points) {
    if(points.length==0)return 0
    let result=1
    points.sort((a,b)=>{
        return a[0] - b[0]
    })
    for(let i=1;i<points.length;i++){
        if(points[i][0]>points[i-1][1]){
            result++
        }else{
            points[i][1] = Math.min(points[i-1][1],points[i][1])
        }
    }
    return result
};

你可能感兴趣的:(算法笔记,贪心算法,算法)