用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以縱座標並不重要,因此只要知道開始和結束的橫座標就足夠了。開始座標總是小於結束座標。
一支弓箭可以沿著 x 軸從不同點完全垂直地射出。在座標 x 處射出一支箭,若有乙個氣球的直徑的開始和結束座標為 x start,x end, 且滿足 x start ≤ x ≤ x end,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。 弓箭一旦被射出之後,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。
給你乙個陣列 points ,其中 points [i] = [x start,x end] ,返回引爆所有氣球所必須射出的最小弓箭數。
示例 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 <=
104points[i]
.length ==2-
231<= xstart < xend <=
231-
1
方法一:排序+貪心演算法
思路:由於每個氣球的寬度是固定的,我們只需要把所有的氣球按照右邊界的大小進行上公升排序,然後將第一隻箭的位置盡可能的在第乙個氣球的右邊,這樣第一支箭引爆的氣球的數量是最多的,然後將引爆的氣球都排除掉,從下乙個未引爆的氣球的右邊界為開始,第二隻箭盡可能的在這個氣球的右邊,以此類推,總共所需的箭則是最少的
class
solution
// 按照每個氣球的右邊界排序
arrays.
sort
(points,
newcomparator
<
int[
]>()
else
if(point1[1]
< point2[1]
)else}}
);// 獲取排序後第乙個氣球右邊界的位置,可以認為箭射入的位置
int loc = points[0]
[1];
// 統計箭的數量
int count =1;
for(
int i =
1; i < points.length; i++)}
return count;
}}
複雜度分析:
時間複雜度:o(nlogn),排序的時間複雜度
空間複雜度:o(logn),排序使用的棧空間
最少數量貨物裝箱問題
題目描述 有重量分別為3,5,7公斤的三種貨物,和乙個載重量為x公斤的箱子 不考慮體積等其它因素,只計算重量 需要向箱子內裝滿x公斤的貨物,要求使用的貨物個數盡可能少 三種貨物數量無限 輸入描述 輸入箱子載重量x 1 x 10000 乙個整數。輸出描述 如果無法裝滿,輸出 1。如果可以裝滿,輸出使用...
leetcode 452 用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
Leetcode 452 用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...