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

860. 柠檬水找零

有如下三种情况:

  • 情况一:账单是5,直接收下。
  • 情况二:账单是10,消耗一个5,增加一个10
  • 情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5
/**
 * @param {number[]} bills
 * @return {boolean}
 */
var lemonadeChange = function (bills) {
    let fiveCount = 0
    let tenCount = 0

    for (let i = 0; i < bills.length; i++) {
        let bill = bills[i]
        if (bill === 5) {
            fiveCount += 1
        } else if (bill === 10) {
            if (fiveCount > 0) {
                fiveCount -= 1
                tenCount += 1
            } else {
                return false
            }
        } else {
            if (tenCount > 0 && fiveCount > 0) {
                tenCount -= 1
                fiveCount -= 1
            } else if (fiveCount >= 3) {
                fiveCount -= 3
            } else {
                return false
            }
        }
    }
    return true
};

406.根据身高重建队列

本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后再按照另一个维度重新排列。

那么按照身高h来排序呢,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。
接下来就要按照k重新插入队列:优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点(因为是按照身高从大到小的顺序排过的),最终按照k的规则完成了队列。

/**
 * @param {number[][]} people
 * @return {number[][]}
 */
var reconstructQueue = function (people) {
    let queue = []
    people.sort((a, b) => {
        if (b[0] !== a[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. 用最少数量的箭引爆气球

重叠区间问题
在这里插入图片描述
为了让气球尽可能的重叠,需要对数组进行排序。

  • 如果当前气球的左边界大于上一气球的右边界,说明没有重叠,需要一支箭。
  • 如果气球重叠了,要设置右边界的最小值,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭。
/**
 * @param {number[][]} points
 * @return {number}
 */
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
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值