給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。
注意:可以認為區間的終點總是大於它的起點。
區間 [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.在可選的工作中,選取開始時間最早的.反例 這種情況下先...