演算法 貪心 用最少數量的箭引爆氣球

2021-10-05 05:30:00 字數 1087 閱讀 7806

在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以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(射爆另外兩個氣球)。

我們貪心的希望每次用乙個弓箭手射擊到盡可能多的氣球:

將氣球座標start end 從小到大排序

排序後,維護乙個全域性右邊界right,只要乙個氣球左邊界小於該全域性右邊界right,就說明可以用乙個弓箭手射擊。

但還需要判斷這個氣球右邊界是否小於全域性右邊界,如果小於就需要更新全域性右邊界

否則,就更新全域性右邊界,且弓箭手數量加一,表示跟之前右邊界不重合,需要新的弓箭手射擊

class

solution

// 對氣球座標先按start,相同時再按end排序

arrays.

sort

(points,

(o1, o2)

->

else})

;int result =1;

// 維護右邊界

用最少數量的箭引爆氣球

在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...

用最少數量的箭引爆氣球

在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...

用最少數量的箭引爆氣球

思考 首先將樣例畫圖,找出規律理解題意,其次舉例子,1個氣球最少用1個箭,2個重疊氣球最少用乙個箭,3個重疊氣球最少用乙個箭 因此,盡量使氣球重疊部分最多一些,那麼如何演算法化呢?當然是排序,然後遍歷維護射擊區間。1,排序,按照左端點。2,遍歷氣球陣列,維護乙個設計區間,初始化就是第乙個氣球的區間,...