貪心思想之無重疊區間問題

2021-10-09 03:01:17 字數 2935 閱讀 3869

給你很多形如[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是最好的,也符合區域性貪心思想。然後把所有區間按左端點...