寫在前面:貪心演算法一般用來解決需要 「找到要做某事的最小數量」 或 「找到在某些情況下適合的最大物品數量」 的問題,且提供的是無序的輸入。
題目描述:在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。
一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣球的直徑的開始和結束座標為 xstart,xend, 且滿足 xstart ≤ x ≤ xend,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。 弓箭一旦被射出之後,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。
解題思路:首先對座標點進行排序,按照從小到大的順序排序,如果遇到開始座標相同的點,則將結束座標更小的點排在前面,因為從左考慮引爆氣球時,如果結束點更小的氣球能引爆,那麼結束點更大的也一定能引爆,但相反就不成立。因為每乙個氣球都要引爆,那麼我們就一次排列排序好的氣球,在保證每個球能引爆的情況下貪心地引爆最多的氣球,那麼就要求後面遍歷到的氣球的起始座標必須在前面的氣球的結束座標之內,否則就要重新用一支箭進行引爆,不用考慮開始座標,因為已經事先排過序,那麼後面的氣球的起始座標一定是大於等於前面的氣球的起始座標的
,**如下:
class
solution
:def
findminarrowshots
(self, points: list[list[
int]])
->
int:
defcmp
(x1, x2)
:if x1[0]
< x2[0]
:return-1
elif x1[0]
> x2[0]
:return
1else
:if x1[1]
< x2[1]
:return-1
elif x1[1]
> x2[1]
:return
1else
:return
0from functools import cmp_to_key
points =
sorted
(points, key=cmp_to_key(
cmp)
) pre =
float
('-inf'
) res =
0for p in points:
if p[0]
> pre:
res +=
1 pre = p[1]
else
: pre =
min(pre, p[1]
)return res
452 用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
452 用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
貪心 452 用最少數量的箭引爆氣球
難度 中等 在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以縱座標並不重要,因此只要知道開始和結束的橫座標就足夠了。開始座標總是小於結束座標。一支弓箭可以沿著 x 軸從不同點完全垂直地射出。在座標 x 處射出一支箭,若有乙個氣球的直徑...