1. 程式人生 > >leetcode 452 Minimum Number of Arrows to Burst Balloons(射擊氣球最小射擊手數目)貪心

leetcode 452 Minimum Number of Arrows to Burst Balloons(射擊氣球最小射擊手數目)貪心

題目

思路:

活動選擇問題,會議室選擇問題開展最多會議數目,其實一一個型別

將開始時間(座標)和結束時間排序(任選一個就行,我看c++做法裡面有按照開始時間排序,本體中是結束時間排序,感覺按照結束時間排序更合理)

將所有的氣球按照終止位置排序,開始從前向後掃描。以第一個氣球的終止位置為準,只要出現的氣球起始位置小於這個氣球的終止位置,代表可以一箭使這些氣球全部爆炸;當出現一個氣球的起始位置大於第一個氣球的終止位置時再以這個氣球的終止位置為準,找出所有可以再一箭爆炸的所有氣球;以此類推

上面這個圖是看的刷題班裡面給的思路,感覺不是很好,看看圖吧理解一下

class Solution {
    public int findMinArrowShots(int[][] points) {
         if(points ==null||points.length==0||points[0].length==0){
             return 0;
         }
        Arrays.sort(points,new Comparator<int[]>() {//右端點排序
            public int compare(int[] a, int[] b){
                return a[1]-b[1];
            }
        });
         //從左往右射擊   
        int lastEnd = points[0][1];//題上沒說只在第一區間,所以有可能在第二象限
        int minShots=1;
        for(int i=1;i<points.length;i++){
            if(lastEnd<points[i][0]){
                lastEnd=points[i][1];
                minShots++;
            }
        }
        return minShots;
    }
}

注意:

新寫的compara函式裡面返回序列是

return a[1]-b[1];

這就是說明是按照points二維陣列中的行中的第二列(下標是1)進行排序的