leetcode 452

ublic class Solution {
    public int findMinArrowShots(int[][] points) {
        //贪心思路,选取最能够射到最多气球的点射箭。
        //可是要怎么找到这个点呢,很难受。
        //将所有点按照起始点排序,起始点相同时按照终止点排序。
        //之后只需要从开头往后遍历,找到最多能够被同时射爆的气球即可。
        //怎么证明这个思路是正确的呢。
        //从贪心算法的本质说起,贪心算法要求要解决的问题有贪心选择性跟最优子结构。
        //假设我们找到一个能射爆气球最多的点,用这个点可以将问题分成两个子问题,这个点左边的未射爆气球所需要的最少箭数加上这个点右边未射爆
        //气球的最少箭数,加1即为原问题的解。
        //那么我们只要证明,通过排序后遍历所找到的点,是其中一个射爆气球最多的点即可。
        //如果这个点不是射爆气球最多的点之一,那么必然能够找到另一个点,能够射爆这个点所射爆的气球,并且还能射爆其他气球,这显然是不可能的。
        if(points.length == 0)
            return 0;
    int output = 1;
        Arrays.sort(points,(x,y)->x[0] == y[0]?x[1]-y[1]:x[0]-y[0]);
        int start = points[0][1];
        for(int i = 1;i < points.length;i++){
        if(points[i][0] <= start){
        if(points[i][1]<start)
           start = points[i][1];
        }
        else {
        output++;
        start = points[i][1];
        }
       
        }
        return output;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值