Leetcode 题解 -- 贪心--投飞镖刺破气球

博客围绕452. Minimum Number of Arrows to Burst Balloons (Medium)题目展开,该题是求解最小投飞镖次数使水平数轴上的气球都被刺破,本质是计算不重叠区间个数。思路是先对区间按右边界排序,设置cnt计算飞镖数,通过循环和引入start判断气球是否重叠。

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

投飞镖刺破气球

452. Minimum Number of Arrows to Burst Balloons (Medium)

相比较上一个题调整了start的位置 因为start只有在前一堆重叠的气球里面不在有效了 人就换成下一个气球所在的区间

Input:

[[10,16], [2,8], [1,6], [7,12]]

 

Output:

2

题目描述:气球在一个水平数轴上摆放,可以重叠,飞镖垂直投向坐标轴,使得路径上的气球都会刺破。求解最小的投飞镖次数使所有气球都被刺破。

也是计算不重叠的区间个数,不过和 Non-overlapping Intervals 的区别在于,[1, 2] 和 [2, 3] 在本题中算是重叠区间。

 

思路:跟上一道题一样 拿到手就想着把区间先排个序,按照以往的规则考虑按右边界来排序,这很好理解。接下来

设置一个cnt来计算飞镖个数,只要区间存在那起码是1个飞镖起步

再看for循环 从第二个区间开始考虑,只要第i个区间的左边界比第i-1个左区间的右边界小或者相等,就说明一个飞镖足以射穿这俩,但是如果i+1 的左边界也是比i-1的右边界小呢?这不能试试用循环i的方式来解决 是需要引入一个start

start从0开始 直到满足了右边界比第i区间的左边界小了,说明气球不再重叠。那么此时下一个start应该就是这个i区间 

 

class Solution {
    public int findMinArrowShots(int[][] points) {
        if(points.length == 0)
            return 0;
        Arrays.sort(points,new Comparator<int[]>(){
            public int compare(int[] i1,int[] i2){
                return i1[1] -i2[1];
            }
        });
        int cnt = 1;
        int start = 0;
        for(int i=1; i<points.length; i++){
            if(points[i][0] - points[start][1] <= 0){
                continue;
            }
            start = i;
            cnt++;
        }
        return cnt;
       
        
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值