LeetCode 452 用最少數量的箭引爆氣球
阿新 • • 發佈:2020-09-09
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; } }