C 貪心 如何用最少的箭射爆全部氣球

2021-10-09 03:55:40 字數 1801 閱讀 4883

在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以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 處射出一支箭,若有乙個氣球的直徑...