給你很多形如[start,end]的閉區間,請你設計乙個演算法,算出這些區間中最多有幾個互不相交的區間。
這個問題在生活中的應用廣泛,比如你今天有好幾個活動,每個活動都可以用區間[start,end]表示開始和結束的時間,請問你今天最多能參加幾個活動呢?
可以分為以下三步:
把這個思路實現成演算法的話,可以按每個區間的end數值公升序排序,因為這樣處理之後實現步驟 1 和步驟 2 都方便很多.
由於我們事先排了序,不難發現所有與 x 相交的區間必然會與 x 的end相交;如果乙個區間不想與 x 的end相交,它的start必須要大於(或等於)x 的end:
**如下
def
intervalschedule
(intervals):if
len(intervals)==0
:return
0 intervals.sort(key=
lambda x:x[1]
) cnt =
1 x_end = intervals[0]
[1]for inter in intervals[1:
]:if inter[0]
>= x_end:
cnt +=
1 x_end = inter[1]
return cnt
給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。
注意:可以認為區間的終點總是大於它的起點。
區間 [1,2] 和 [2,3] 的邊界相互「接觸」,但沒有相互重疊。
示例 1:
輸入: [
[1,2], [2,3], [3,4], [1,3]
]輸出: 1
解釋: 移除 [1,3] 後,剩下的區間沒有重疊。
示例 2:
輸入: [
[1,2], [1,2], [1,2]
]輸出: 2
解釋: 你需要移除兩個 [1,2] 來使剩下的區間沒有重疊。
示例 3:
輸入: [
[1,2], [2,3]
]輸出: 0
解釋: 你不需要移除任何區間,因為它們已經是無重疊的了。
直接看**:
class
solution
:def
eraseoverlapintervals
(self, intervals: list[list[
int]])
->
int:
ifnot intervals:
return
0 intervals =
sorted
(intervals, key =
lambda x: x[1]
) cnt =
0# 要刪除的區間個數
end = intervals[0]
[1]# 最先結束的區間
for inter in intervals[1:
]:if inter[0]
< end:
# 開始小於最先結束的,所以有重疊
cnt +=
1else
: end = inter[1]
# 無重疊,更新結束時間
return cnt
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。
一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣球的直徑的開始和結束座標為 xstart,xend, 且滿足 xstart ≤ x ≤ xend,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。 弓箭一旦被射出之後,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。
example:
輸入:
[[10,16], [2,8], [1,6], [7,12]
]輸出:
2解釋:
對於該樣例,我們可以在x = 6(射爆[2,8],[1,6]兩個氣球)和 x = 11(射爆另外兩個氣球)。
如果最多有n個不重疊的區間,那麼就至少需要n個箭頭穿透所有區間
只是有一點不一樣,在intervalschedule演算法中,如果兩個區間的邊界觸碰,不算重疊;而按照這道題目的描述,箭頭如果碰到氣球的邊界氣球也會**,所以說相當於區間的邊界觸碰也算重疊
看**:
class
solution
:def
findminarrowshots
(self, points: list[list[
int]])
->
int:
ifnot points:
return
0 points.sort(key=
lambda x: x[1]
) end = points[0]
[1] cnt =
1# 最少乙個區間
for point in points[1:
]:if point[0]
> end:
# 無重疊,個數加1
cnt +=
1 end = point[1]
# 更新結束時間
return cnt
對於區間問題的處理,一般來說第一步都是排序,相當於預處理降低後續操作難度。但是對於不同的問題,排序的方式可能不同,需要具體問題具體分析 最優合併問題 貪心思想
最優合併問題 description 給定k 個排好序的序列s1 s2,sk 用2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的2 路合併演算法合併2 個長度分別為m和n的序列需要m n 1次比較。試設計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。為了進行比較,還需要...
超級書架(貪心思想)
題面 from luogu 超級書架 farmer john最近為奶牛們的圖書館添置了乙個巨大的書架,儘管它是如此的大,但它還是幾乎瞬間就被各種各樣的書塞滿了。現在,只有書架的頂上還留有一點空間。所有n 1 n 20,000 頭奶牛都有乙個確定的身高h i 1 h i 10,000 設所有奶牛身高的...
貪心思想之區間貪心 關聯洛谷P1803
力扣上也有一道類似的題 幾乎是一樣 輸出不同 力扣leetcode 435.無重疊區間 n個比賽 開始時間,結束時間 問乙個人最多能參加幾個 不能同時參加兩個且必須有始有終 首先考慮最簡單的情況,如果區間l1被區間l2包含 圖a 那麼顯然選擇l1是最好的,也符合區域性貪心思想。然後把所有區間按左端點...