射擊氣球 LeetCode452

2021-10-08 21:04:43 字數 1696 閱讀 3493

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

貪心規律:

1.對於某個氣球,至少需要使用1只弓箭將它擊穿。

2.在這只氣球將其擊穿的同時,盡可能擊穿其他更多的氣球!(貪心!)

演算法思路:

1.對各個氣球進行排序,按照氣球的左端點從小到大排序。

2.遍歷氣球陣列,同時維護乙個射擊區間,在滿足可以將當前氣球射穿的情況下,盡可能擊穿更多的氣球,每擊穿乙個新的氣球,更新一次射擊區間(保證射擊區間可以將新氣球也擊穿)。

3.如果新的氣球沒辦法被擊穿了,則需要增加一名弓箭手,即維護乙個新的射擊區間(將該氣球擊穿),隨後繼續遍歷氣球陣列

貪心:先將氣球按照起始座標從小到大排序,維護乙個射擊區間,初始為第乙個氣球的區間

遍歷更新射擊區間

什麼時候更新射擊區間?

當當前氣球左座標大於射擊區間的結束座標:

更新射擊區間的起始座標,如果射擊區間的結束座標大於當前氣球的結束座標,還要更新區間的結束座標

*/#include

#include

#include

using

namespace std;

bool

cmp(vector<

int>

&a,vector<

int>

&b)class

solution

sort

(points.

begin()

,points.

end(

);cmp)

;//射擊次數初始為1

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;}}

;int

main()

LeetCode 452 射擊氣球

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

leetcode452引爆氣球

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

LeetCode 452 投飛鏢刺破氣球

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