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

投飞镖刺破气球

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值