重疊區間問題之逆思維的貪心演算法

2021-10-06 19:00:58 字數 1492 閱讀 4867

給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。

注意:可以認為區間的終點總是大於它的起點。

區間 [1,2] 和 [2,3] 的邊界相互「接觸」,但沒有相互重疊。

本題主要有兩個難點:

如何找到貪心策略

如何斷定兩區間重疊

貪心策略:

問題轉化:移除哪個區間,轉化為選擇哪些區間

貪心選擇:

根據每個區間的末尾排序,由小到大,這樣下乙個元素更不可能與其重疊,我們選擇的便就更多。

當新區間和上乙個選擇的重疊時,因為他的結尾更大,我們只需記錄移除加一不選擇

當新區間和上乙個選擇重疊時,我們選擇他。並於下乙個新區間檢查重疊

如何斷定兩區間重疊:

因為我們採用右邊界,由小到大排序,所以新區間右邊界》=原區間右邊界

此時當且僅當新左邊界《原區間右邊界,兩區域重疊

**:

class

solution

:def

eraseoverlapintervals

(self, intervals: list[list[

int]])

->

int:

#空列表,返回0

iflen

(intervals)==0

:return

0#根據每個**區間的末尾排序**,由小到大

intervals.sort(key=

lambda x:x[1]

) l=intervals[0]

m=0for i in

range(1

,len

(intervals)):

#兩區域重疊,記錄加一

if intervals[i][0

]: m+=

1#不重疊,選擇它

else

: l=intervals[i]

return m

附加:一般(未排序)區間重疊性

當兩區間重疊時,滿足:b左邊界<=a左邊界ora左邊界<=b左邊界

當兩區間不重疊時,不會滿足上述結論

435 無重疊區間(貪心演算法)

給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。注意 可以認為區間的終點總是大於它的起點。區間 1,2 和 2,3 的邊界相互 接觸 但沒有相互重疊。示例 1 輸入 1,2 2,3 3,4 1,3 輸出 1 解釋 移除 1,3 後,剩下的區間沒有重疊。示例 2 輸入 1,2 1,...

貪心演算法 區間問題

區間選單個點 問題描述 數軸上有n個閉區間 ai,bi 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 輸入 第1行 乙個整數n 接下來n行,每行2個整數ai,bi 輸出 乙個整數,表示滿足條件的最少點數。樣例輸入 5 4 62 3 1 46 8 5 7 樣例輸出 2策略分...

貪心演算法之區間排程問題

分析 拿到這道題目,首先要看清楚最終的題目要求,它的要求是參與盡可能多的工作,並不是說工作總時間最長。對於這題我們其實可以使用貪心演算法,就是不斷選取當前最優策略 我們不斷選取工作,其實可以有以下幾種思路進行選取,並進行聚反例來排除這種思路 1.在可選的工作中,選取開始時間最早的.反例 這種情況下先...