代码随想录算法训练营Day35|LC860 柠檬水找零&LC406 根据身高重建队列&LC452 用最少数量的箭引爆气球

文章介绍了三种编程问题的解决方案:使用贪心策略处理找零问题,通过数组排序和优先级规则重构身高队列,以及利用最少箭矢覆盖所有气球。展示了如何运用简单的算法技巧解决复杂问题。
摘要由CSDN通过智能技术生成

一句话总结:身高队列看起来不简单,实际上也很难。

原题链接:860 柠檬水找零

简单贪心思想即可。5元时加入cnt5,10元时cnt10++,cnt5--, 20元时则优先找零10元再找零5元,这样最后判断是否在一次找零后是否cnt5<0即可。

class Solution {
    public boolean lemonadeChange(int[] bills) {
        if (bills[0] != 5) return false;
        int cntFive = 1, cntTen = 0;
        int n = bills.length;
        for (int i = 1; i < n; ++i) {
            if (bills[i] == 5) ++cntFive;
            else if (bills[i] == 10) {
                ++cntTen;
                --cntFive;
            } else {
                if (cntTen > 0) {
                    --cntFive;
                    --cntTen;
                } else cntFive -= 3;
            }
            if (cntFive < 0) return false;
        }
        return true;
    }
}

原题链接:406 根据身高重建队列

先对数组按第一个元素h降序排列,如果数组的第一个元素相等,则对第二个元素升序排列。再将排序后的数组按照其第二个元素的优先级依次排列入队,返回即可。

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, (a, b) -> {
            if (a[0] == b[0]) return a[1] - b[1];
            return b[0] - a[0];
        });
        LinkedList<int[]> que = new LinkedList<>();
        for (int[] p : people) que.add(p[1], p);
        return que.toArray(new int[people.length][]);
    }
}

 原题链接:452 用最少数量的箭引爆气球

先对数组按照升序排序,然后将初始气球的左边界设置为第一个气球的左边界,初始右边界设置为第一个气球的右边界,再依次对每个元素数组进行比较,如果超过(即大于)之前的右边界,那么计数器+1,然后更新左右边界,否则仅更新左右边界为重叠部分即可。

class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
        int ans = 1;
        int start = points[0][0], end = points[0][1];
        for (int[] point : points) {
            if (point[0] > end) {
                ans++;
                start = point[0];
                end = point[1];
            } else {
                start = Math.max(start, point[0]);
                end = Math.min(end, point[1]);
            }
        }
        return ans;
    }
}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值