LeetCode——452. 用最少数量的箭引爆气球(贪心、Lambda表达式区间右端升序排序)

题目描述:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题思路:

1、 一开始做这道题,我思路想错了,以为是合并区间后,然后看还有多少个区间就是答案。其实这道题不是这样的。因为前面如果按照合并区间后,可能出现几个区间需要多个子弹射击才能符合条件,但是由于前面吧区间合并了,所有最后计算的时候也会出错。
这道题正确的做法,是按照右端端点升序排序后利用贪心。
重点是要理解为什么用右端排序。
2、 右端升序排序后,第一个区间的结束位置和下一个区间的开始位置比较,如果比下一个区间小的话,说明两个区间不连续,无法做到一个子弹射击掉,所有count++,然后根据贪心,更新到下一个区间结束的位置(大的),开始时候是最理想的情况,所有都连一块,可以一发子弹射击掉所有的气球,count初始值设置为1。
3、 这道题还有个坑,一开始我写的Lambda表达式,让o1-o2,排序出错了,是由于题目给的一个数据
[[-2147483646,-2147483645],[2147483646,2147483647]]
,在减的时候会溢出,所有要使用Integer.compare(o1[1],o2[1])

参考代码:

    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points,(o1,o2)->Integer.compare(o1[1],o2[1]));
        int[][] arr = new int[points.length][2];
        int a=points[0][1];
        int count=1;
        for (int i = 1; i < points.length; i++) {
            if(a<points[i][0])
            {
                count++;
                a=points[i][1];
            }
        }
        return count;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值