1. 程式人生 > 實用技巧 >LeetCode 452 用最少數量的箭引爆氣球

LeetCode 452 用最少數量的箭引爆氣球

LeetCode 452 用最少數量的箭引爆氣球

問題描述:
  在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。
  一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有一個氣球的直徑的開始和結束座標為 xstart,xend, 且滿足  xstart ≤ x ≤ xend,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。 弓箭一旦被射出之後,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。
貪心思想: 每一次做決定總是期望得到最大的回報

  • 對於當前的一次射擊,期望同時能夠射爆儘可能多的氣球
  • 將無序的資料有序化是貪心演算法的重要預處理方法,對氣球代表的區間按照右邊界排序
  • 對於當前氣球,若右邊的下一氣球與之有重疊(左邊界小於當前氣球右邊界),則可以同時多射爆一個氣球

執行用時:20 ms, 在所有 Java 提交中擊敗了97.28%的使用者
記憶體消耗:47.4 MB, 在所有 Java 提交中擊敗了62.00%的使用者

class Solution {
    public int findMinArrowShots(int[][] points) {
        if(points==null || points.length==0 || points[0].length==0) {
            return 0;
        }
        else if(points.length==1) {
            return 1;
        }
        /*對所有區間按照右邊界排序*/
        Arrays.sort(points, new Comparator<int[]>(){
            public int compare(int[] o1, int[] o2) {
                return o1[1]-o2[1];
            }
        });

        /*從左到右依次處理*/
        int start = 0, curr = 1;
        int count = 1;
        while(curr<points.length) {
            if(points[curr][0]>points[start][1]) {
                start = curr;
                count++;
            }
            curr++;
        }

        return count;
    }
}