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

LeetCode: 452. 用最少数量的箭引爆气球

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


贪心思想。

贪心题 >> 思路: 排序、贪心

按每个气球的区间的右端点大小从小到大排序 >> (达到降维的目的?? 之后就不需要考虑右端点那边的覆盖问题)

样例: [[10,16],[2,8],[1,6],[7,12]]


排序后
1 6 
2 8 
7 12 
10 16 

考虑右端点是否覆盖后面区间的左起点,如果覆盖到了,就是可以连带射爆的气球。

如果不能覆盖,表示ans++, 进行下一发子弹。


AC Code

小贴士: 自定义排序中,根据数据范围,避免 return a[1] - b[1] 时 int 型溢出, 换用 < 等运算符来比较。


    public int findMinArrowShots(int[][] points) {
        if(points.length < 2) return points.length;

        // 自定义排序
        // 按右区间来从小到大排序
        Arrays.sort(points, new Comparator<int[]>(){
            public int compare(int[] a, int[] b){
                if(a[1] < b[1]) return -1;
                if(a[1] > b[1]) return 1;
                else return 0;
            }
        });
        
        // 最大的右
        int right = points[0][1];
        int ans = 1; 
        for (int i = 0; i < points.length; i++) {
            // 找到大于该右端点的左起点。  >>  因为该右端点是最小的, 往后的右端点肯定包含进去
            // 只需要考虑左起点是否在 该右端点的左边。
            // 降维思想
            if(points[i][0] > right){
                right = points[i][1];
                ans++;
            }
        }

        return ans;
    }




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


上一篇:452. 用最少数量的箭引爆气球


下一篇:leetcode-452-用最少数量的箭引爆气球