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