leetcode中「用最少數量的箭引爆氣球」題解

2021-10-10 18:51:01 字數 1880 閱讀 4835

用最少數量的箭引爆氣球

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

一支弓箭可以沿著 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處射出一支箭,若有乙個氣...