✅✅代码随想录算法训练营Day35 || 860. 柠檬水找零 452. 用最少数量的箭引爆气球

134 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情🚀🚀

860. 柠檬水找零 - 力扣(LeetCode)

image.png

代码

var lemonadeChange = function(bills) {
    let fivecount = 0;
    let tencount = 0;
    for(let i = 0; i < bills.length;i++){
        if(bills[i] == 5){
            fivecount++;
        }
        else if(bills[i] == 10){
            fivecount--;
            tencount++;
            if(fivecount < 0){
                return false
            }
        }
        else if(bills[i] == 20){
            if(fivecount > 0 && tencount > 0){
                fivecount--;
                tencount--;
            }
            else{
                fivecount = fivecount - 3;
            }
            if(fivecount < 0 || tencount < 0)
                return false
        }
    }
    return true
};

思路

这道题还是挺好玩的

只需要维护三种金额的数量,5,10和20。

有如下三种情况:

  • 情况一:账单是5,直接收下。
  • 情况二:账单是10,消耗一个5,增加一个10
  • 情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5

为什么对于情况三这里说优先消耗一个10和一个5呢?

其实还是和之前第一个贪心的题一样,因为10的用途只能去给20找零,而5的用途还可以给10找零,5更万能,10更矫情,所以当然是要先把矫情的安排好了~

注意:每种情况都是有前提条件的,如果不满足前提条件就直接false

452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

image.png

代码

var findMinArrowShots = function(points) {
    points.sort((a, b) => {
        return a[0] - b[0]
    })
    let result = 1
    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
};

思路

这里要在脑海中构造这样一个图

image.png

然后每次比较前一个球的右边和下一个球的左边,如果左边大于右边,则让箭+1;否则就缩小后者的右边界。

注意对二维数组的排序写法

    points.sort((a, b) => {
        return a[0] - b[0]
    })