貪心 452 用最少數量的箭引爆氣球

2021-10-21 02:29:54 字數 1713 閱讀 1803

難度 中等

在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以縱座標並不重要,因此只要知道開始和結束的橫座標就足夠了。開始座標總是小於結束座標。

一支弓箭可以沿著 x 軸從不同點完全垂直地射出。在座標 x 處射出一支箭,若有乙個氣球的直徑的開始和結束座標為xstartxend, 且滿足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
和其他合併區間類的題目套路一樣, 都是貪心思想, 先排序, 然後遍歷檢查是否滿足合併區間的條件

這裡判斷是否有交叉區間, 所以其實是計算已知區間的交集數量.

這裡以[[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座...