用最少數量的箭引爆氣球

2021-08-26 05:52:32 字數 1530 閱讀 4686

在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。

一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣球的直徑的開始和結束座標為 xstart,xend, 且滿足  xstart ≤ x ≤ xend,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。 弓箭一旦被射出之後,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。

輸入:[[10,16], [2,8], [1,6], [7,12]]輸出:2解釋:對於該樣例,我們可以在x = 6(射爆[2,8],[1,6]兩個氣球)和 x = 11(射爆另外兩個氣球)。
1、先按照氣球的左半座標排序,這樣把問題更形象化了,應該能夠腦補出氣球在數軸上互相重疊的情景。

2、假設只有乙個氣球,箭的位置最多只能到氣球的右半邊。假設有兩個氣球,箭的位置選擇區域是兩個氣球的交集,所以此時箭的位置最遠可以到交集的右邊。

3、用end記錄每次箭能到達的最遠位置:

可能出現上述兩種情況,end = min (end, x[1]),就是兩個相交氣球右半邊更小的那乙個。這種情況下,只要箭的位置比end小,就能一箭射穿所有氣球。

注:這裡不用考慮左半邊,因為左半邊已經按從小到大排序,所以在<=end的位置一定有解!

4、如果出現兩個氣球沒有交集,如下圖:

即 x[0] > end 時,新的end就是新氣球的右半邊,即 end = x[1]。此時不能用一支箭射穿兩隻氣球,所以箭的數量+1。

5、按上述方式遍歷完所有氣球即可!

class solution:

def findminarrowshots(self, points):

""":type points: list[list[int]]

:rtype: int

"""if len(points) == 0:

return 0

arrows = 1

points = sorted(points, key = lambda x:x[0])

end = points[0][1]

for i in points[1:]:

if i[0] <= end:

end = min(end, i[1])

else:

arrows += 1

end = i[1]

return arrows

用最少數量的箭引爆氣球

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

用最少數量的箭引爆氣球

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

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

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