問題描述
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以縱座標並不重要,因此只要知道開始和結束的橫座標就足夠了。開始座標總是小於結束座標。
一支弓箭可以沿著 x 軸從不同點完全垂直地射出。在座標 x 處射出一支箭,若有乙個氣球的直徑的開始和結束座標為 xstart,xend, 且滿足 xstart ≤ x ≤ xend,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。弓箭一旦被射出之後,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。
給你乙個陣列points ,其中points[i]=[xstart,xend],返回引爆所有氣球所必須射出的最小弓箭數。
示例 1:
輸入:示例 2:points = [[10,16],[2,8],[1,6],[7,12]]
輸出:2
解釋:對於該樣例,x = 6 可以射爆 [2,8],[1,6] 兩個氣球,以及 x = 11 射爆另外兩個氣球
輸入:points = [[1,2],[3,4],[5,6],[7,8]]示例 3:輸出:4
輸入:points = [[1,2],[2,3],[3,4],[4,5]]示例 4:輸出:2
輸入:points = [[1,2]]示例 5:輸出:1
輸入:points = [[2,3],[2,3]]1,氣球按照右邊界排序這題是讓求用最少的箭把所有的氣球全部擊爆。每個氣球都是有寬度的,分別是左邊界和右邊界,這裡只需要把所有的氣球按照右邊界的大小進行排序。然後把第一支箭盡可能的往第乙個氣球的右邊靠,這樣第一支箭引爆氣球的數量就是最多的。同理,第二支箭要盡可能的往第二個氣球(這裡不是排序後的第二個氣球,這裡的第二個氣球是和第乙個氣球座標沒有交集的那個氣球)的右邊靠……。輸出:1
下面來畫個圖看下,假如下面是已經按照右邊界排序好的氣球,
再來看下**
2,氣球按照左邊界排序上面氣球是按照右邊界排序,其實還可以按照左邊界排序,原理都是一樣的,看下**public
intfindminarrowshots
(int
points)
}return count;
}
總結這題和472,插入區間有點類似,但又不同。這題首先要對陣列進行排序,無論是按照氣球的左邊還是右邊排序,實現原理都是一樣的。public
intfindminarrowshots
(int
points)
}return count;
}
用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
用最少數量的箭引爆氣球
思考 首先將樣例畫圖,找出規律理解題意,其次舉例子,1個氣球最少用1個箭,2個重疊氣球最少用乙個箭,3個重疊氣球最少用乙個箭 因此,盡量使氣球重疊部分最多一些,那麼如何演算法化呢?當然是排序,然後遍歷維護射擊區間。1,排序,按照左端點。2,遍歷氣球陣列,維護乙個設計區間,初始化就是第乙個氣球的區間,...