贪心算法4用最少数量的箭引爆气球

Posted 念奕玥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法4用最少数量的箭引爆气球相关的知识,希望对你有一定的参考价值。

leetcode 452 用最少数量的箭引爆气球
在这里插入图片描述
此题与 455 分发饼干异曲同工。

解决思路:
贪心策略:从第一个气球开始找,只要能有1支箭的就不多用,1支箭完成不了的再用下一支箭。
把所有气球的范围在同一条横轴上画出来更易理解。
判断能不能用同一支箭(气球有没有重叠):气球 i + 1 i+1 i+1的左边界小于等于气球 i i i的右边界
过程:
首先对气球按右边界的大小进行升序排序。然后选标准(与哪一个气球进行比较算是相重叠),右边界设置为标准的右边界。
先以第一个气球为标准,与第一个气球有重叠的气球,可共用一支箭。直到遇到无重叠的气球,再以该无重叠的气球为标准,使用下一支箭。直到遍历完所有气球结束。

class Solution {
    public int findMinArrowShots(int[][] points) {
        int n = points.length;
        if(n==0) return 0;
        //首先对气球按右边界的大小进行升序排序
        Arrays.sort(points,new Comparator<int[]>(){
            @Override
            public int compare(int[] o1, int[] o2){
                // 直接return o1[1]-o2[1]的话,
                // [[-2147483646,-2147483645],[2147483646,2147483647]]会过不了
                return Integer.compare(o1[1],o2[1]);
            }
        });
        int right = points[0][1];//第一个气球的右边界
        int count =1;//箭的数量(设置的右边界的数量)
        for(int i=1;i<n;i++){
            //下一个气球的左边界小于等于现在的右边界,则无操作。
            if(points[i][0]>right){//若下一个气球的左边界大于现在的右边界,则无重叠
                //更新右边界
                right=points[i][1];
                //箭的数量+1
                count++;
            }
        }
        return count;
    }
}

以上是关于贪心算法4用最少数量的箭引爆气球的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法:用最少数量的箭引爆气球

leetcode 452 用最少数量的箭引爆气球 贪心算法

leetcode 452 用最少数量的箭引爆气球 贪心算法

452. 用最少数量的箭引爆气球-贪心算法-Comparator比较器使用

贪心452. 用最少数量的箭引爆气球

用最少数量的箭引爆气球理解贪心