【LeetCode101】leetcode452 用最少数量的箭引爆气球

原题链接

在选择用一根箭射穿的气球时,气球的结尾坐标很重要。结尾坐标内包含的气球越多,则一根箭能射穿的气球就越多。所以贪心策略就是优先找出一个气球的结尾坐标包含越多的气球。

具体实现方法时,先把区间按照结尾的大小升序排序,每次选择当前气球与前面的所有气球都有重复区间,即当前气球的开始坐标小于前面的任何一个气球的结尾坐标(表示当前气球跟前面的气球能被用一根箭射穿),若当前气球不能跟前面的气球被同一根箭射穿,则令index等于当前气球下标(后面的气球不用跟index之前的气球比较了)。

代码

class Solution {
    public int findMinArrowShots(int[][] points) {
        List<int[]> list = Arrays.asList(points) ;
        Collections.sort(list , new Comparator<int[]>(){
            @Override
            public int compare( int[] o1 , int[] o2 ){
                if( o1[1] > o2[1] ){
                    return 1 ;
                }
                else if( o1[1] < o2[1] ){
                    return -1 ;
                }
                else{
                    return 0 ;
                }
            }
        }) ;

        int count = 1 ;
        int index = 0 ;
        for( int i = 1 ; i < list.size() ; i++ ){
            int[] curr = list.get(i) ;
            for( int j = index ; j < i ; j++ ){
                int[] pre = list.get(j) ;
                if( curr[0] <= pre[1] ){
                    continue ;
                }
                else{
                    index = i ;
                    count++ ;
                    break ;
                }
            }
        }

        return count ;
    }   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值