在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以縱座標並不重要,因此只要知道開始和結束的橫座標就足夠了。開始座標總是小於結束座標。
一支弓箭可以沿著 x 軸從不同點完全垂直地射出。在座標 x 處射出一支箭,若有乙個氣球的直徑的開始和結束座標為 xstart,xend, 且滿足 xstart ≤ x ≤ xend,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。 弓箭一旦被射出之後,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。
給你乙個陣列 points ,其中 points [i] = [xstart,xend] ,返回引爆所有氣球所必須射出的最小弓箭數。
示例 1:
輸入:points = [[10,16],[2,8],[1,6],[7,12]]
輸出:2
解釋:對於該樣例,x = 6 可以射爆 [2,8],[1,6] 兩個氣球,以及 x = 11 射爆另外兩個氣球
示例 2:
輸入:points = [[1,2],[3,4],[5,6],[7,8]]
輸出:4
示例 3:
輸入:points = [[1,2],[2,3],[3,4],[4,5]]
輸出:2
示例 4:
輸入:points = [[1,2]]
輸出:1
示例 5:
輸入:points = [[2,3],[2,3]]
輸出:1
0 <= points.length <= 104
points[i].length == 2
-231 <= xstart < xend <= 231 - 1 **
此題目可採用貪心演算法,即對於若干個氣球,我們只要從氣球右座標最小的的乙個氣球的右座標開始,即記他的那個座標為起點1,對他通過迴圈進行判斷,即比較第乙個第二個第三個。。的左座標與1的大小,如果他們小於1,則可知就在這點放一支箭即可能保證這個氣球和那些左邊座標小於他右邊座標的氣球被射破。(因為已經確定他們的右邊座標大於我們所選取的起點1了,所以一定包含在內。)
所以可知,在確定了第一支箭能射破的氣球後,就該到下乙個他射不到的氣球了。這時候就即對下乙個他射不到的氣球,即在迴圈中其左邊座標大於1的那些氣球的離1最近的乙個。同理他也應該和1一樣構建迴圈遍歷。
intpx(
void
* _x,
void
* _y)
intfindminarrowshots
(int
** points,
int pointssize,
int* pointscolsize)
sum++
;//至少一箭
int i;
qsort
(points,pointssize,
sizeof
(int*)
,px)
;//由於氣球本來在二維影象上其實因為座標的限制已經相當於按順序排列好了,但這題目給我們的陣列是沒有排列好的
//所以我們按照其關鍵的決定起點的右座標作為引數比較來排序
int start = points[0]
[1];
//排序完後自然第乙個便是右座標最左邊的那個
for(i=
0;i)//對氣球個數進行乙個乙個找
}return sum;
}
力扣 452 用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...