代码随想录算法训练营补打卡 day35 | 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

文章提供了三道编程题的思路和代码实现,包括860.柠檬水找零,使用变量管理不同面额的纸币以优化找零;406.根据身高重建队列,通过排序和索引插入解决;452.用最少数量的箭引爆气球,通过排序处理重叠区间达到最小箭数。
摘要由CSDN通过智能技术生成


代码随想录

860.柠檬水找零

思路

思路:用一个变量记录当前纸币5的数量以及10的数量,在找零20的时候,优先选择5和10 的组合,因为5能够找零的场景更多。

题解代码

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int five = 0;
        int ten = 0;

        for (int i = 0; i < bills.length; i++) {
            if (bills[i] == 5) {
                five++;
            } else if (bills[i] == 10) {
                five--;
                ten++;
            } else if (bills[i] == 20) {
                if (ten > 0) {
                    ten--;
                    five--;
                } else {
                    five -= 3;
                }
            }
            if (five < 0 || ten < 0) return false;
        }
        
        return true;
    }
}

406.根据身高重建队列

思路

思路:找到身高最矮的人,然后找到他前面有多少人是等于或高于他,就可以确定他在第几个位置。
题解思路:有两个维度,h和k 需要先确定一个维度,再按照另一个维度重新排列。
因为k统计的是 前面大于等于他的数量,所以需要按照h从大到小排, 如果相等再按照k从小到大排。
按照k来插入节点,后续插入的节点也不会影响前面已经插入的节点。

linkedlist有一个方法是按照索引插入 add(索引,元素)
以及toArray方法

代码

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];
        });

        List<int[]> l = new LinkedList<>();
        for(int[] p : people){
            l.add(p[1],p);
        }
        return l.toArray(new int[people.length][]);

    }
}

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

思路

题解思路:先按照x坐标的最左边位置排序, 当前一个的最右坐标大于后一个的最左坐标,表示此时需要多一个箭。
并且需要每次缩小一下重叠的最小右边界

代码

class Solution {
    public int findMinArrowShots(int[][] points) {

        int count = 1;
        Arrays.sort(points,(a,b)->Integer.compare(a[0],b[0]));

        for(int i = 1;i<points.length;i++){
            if(points[i][0]>points[i-1][1]){
                count++;
            }else{
                points[i][1] = Math.min(points[i][1],points[i-1][1]);
            }
            
        }
        return count;

    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值