難度 中等
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以縱座標並不重要,因此只要知道開始和結束的橫座標就足夠了。開始座標總是小於結束座標。
一支弓箭可以沿著 x 軸從不同點完全垂直地射出。在座標 x 處射出一支箭,若有乙個氣球的直徑的開始和結束座標為x
start
,x
end
, 且滿足xstart ≤ x ≤ x
end
,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。 弓箭一旦被射出之後,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。
給你乙個陣列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和其他合併區間類的題目套路一樣, 都是貪心思想, 先排序, 然後遍歷檢查是否滿足合併區間的條件
這裡判斷是否有交叉區間, 所以其實是計算已知區間的交集數量.
這裡以[[10,16],[2,8],[1,6],[7,12]] 為例子:
先排序, 我是按區間開始位置排序, 排序後: [[1,6],[2,8],[7,12],[10,16]]
遍歷計算交叉區間(待發射箭頭),
待發射箭頭的區間range = [1, 6], 需要的箭數量 arrows = 1;
區間[2, 8], 和帶發射區間[1, 6]有交集: 更新發射區域為它們的交集 range = [2, 6]
區間[7, 12], 和待發射區間[2, 6]沒有任何交集, 說明需要增加乙個新的發射區域, 新的待發射區域range = [7, 12]
區間[10,16], 和待發射區域[7, 12]有交集, 待發射區域更新為[10, 12]
返回需要待發射區間的個數
class solution ;
for (int i=0;i// 沒有交集, 增加箭頭數量, 將待發射區間設定為當前區間
else
}return arrows;
}};
452 用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
452 用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
452 用最少數量的箭引爆氣球
寫在前面 貪心演算法一般用來解決需要 找到要做某事的最小數量 或 找到在某些情況下適合的最大物品數量 的問題,且提供的是無序的輸入。題目描述 在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座...