在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。
一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣球的直徑的開始和結束座標為 xstart,xend, 且滿足 xstart ≤ x ≤ xend,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。 弓箭一旦被射出之後,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。
example:
輸入:[[10,16], [2,8], [1,6], [7,12]]
輸出:2
解釋:對於該樣例,我們可以在x = 6(射爆[2,8],[1,6]兩個氣球)和 x = 11(射爆另外兩個氣球)。
如圖所示:
正如上圖所展現的,我們可以從左邊向右判斷,對於靠近左邊的氣球用一箭盡可能多的打中多個氣球,那麼就要要將所給區域進行排序之後,判斷以下情況:
①從第乙個區域開始,起點shoot_begin到shoot_end,有部分區域將會和其他的氣球重合,那麼在重合的區域射擊就可以同時打爆他們,但以貪心的思想,我們還可以繼續將這一箭的效益繼續使用,在走過第乙個區域的shoot_end之前,我們繼續尋找與之重合的區域,使得這一箭將能夠射爆最多的氣球,即只要下一區域的shoot_begin小於上一區域的shoot_end就可以繼續實現區域的重合,直到下一區域的shoot_begin大於上一區域的shoot_end就不得不射出一箭,將之前重合的區域氣球射爆。
②也有可能出現的情況:下一區域的shoot_end也小於上一區域的shoot_end,那麼這一箭的shoot_end就要縮減為下一區域的shoot_end在進行接下來的判斷,否則將會錯多這個兩邊都要小的區域,使得射過一箭後,還要另外一箭進行補充,不符合貪心的思想。
過程如圖所示:
實現**如下:
class
solution
sort
(points.
begin()
,points.
end())
;//排序氣球區域
int shoot_num =1;
int shoot_begin = points[0]
[0];
//最左邊的氣球區域記錄
int shoot_end = points[0]
[1];
for(
int i =
1; i < points.
size()
; i++)}
else
}return shoot_num;}}
;
用最少的箭引爆氣球 leetcode 貪心
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
演算法 貪心 用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
貪心 452 用最少數量的箭引爆氣球
難度 中等 在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以縱座標並不重要,因此只要知道開始和結束的橫座標就足夠了。開始座標總是小於結束座標。一支弓箭可以沿著 x 軸從不同點完全垂直地射出。在座標 x 處射出一支箭,若有乙個氣球的直徑...