Day35 贪心 part04

本文介绍了三个编程问题的解决方案,涉及贪心策略:柠檬水找零通过计算5、10和20面额钞票的变化;队列重构根据身高和数量有序排列;最少箭引爆气球则依据结束时间对点进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Day35 贪心 part04

860.柠檬水找零

我的思路:
只要逐个考虑bills数组可能的数字 5/10/20,分别考虑

解答:

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int fivecount = 0;
        int tencount = 0;
        for(int bill : bills) {
            if(bill == 5) {
                fivecount++;
            }
            else if(bill == 10) {
                if(fivecount <= 0) {
                    return false;
                }
                fivecount --;
                tencount ++;
            }
            else {
                if(fivecount > 0 && tencount > 0) {
                    fivecount --;
                    tencount --;
                }
                else if(fivecount >= 3) {
                    fivecount -= 3;
                }
                else {
                    return false;
                }
            }
        }
        return true;
    }
}

406.根据身高重建队列

我的思路:
类似分糖果,people[i] = [hi, ki] 如果身高h相同,k按照从小到大排序,否则按照身高h从高到低排序

解答:

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        ArrayList<int[] > list = new ArrayList<>();
        Arrays.sort(people, (a, b) -> a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]);
        for(int[] person : people) {
            list.add(person[1], person);
        }
        int[][] res = new int[people.length][2];
        for(int i = 0; i < people.length; i ++) {
            res[i] = list.get(i);
        }
        return res;
    }
}

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

我的思路:
需要注意的是,对point进行排序的时候,是按end值进行从小到大排序

解答:

class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, (a, b) -> Integer.compare(a[1], b[1]));
        int arrow = 1;
        int end = points[0][1];
        for(int i = 0; i < points.length; i ++) {
            if(points[i][0] > end) {
                arrow ++;
                end = points[i][1];
            }
        }
        return arrow;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值