LeetCode 435 無重疊區間 做題小結

2021-10-12 16:16:53 字數 1796 閱讀 1291

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

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

區間 [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

解釋: 你不需要移除任何區間,因為它們已經是無重疊的了。

「相信很多同學看到這道題目都冥冥之中感覺要排序,但是究竟是按照右邊界排序,還是按照左邊界排序呢?」

這其實是乙個難點!

按照右邊界排序,就要從左向右遍歷,因為右邊界越小越好,只要右邊界越小,留給下乙個區間的空間就越大,所以從左向右遍歷,優先選右邊界小的。

按照左邊界排序,就要從右向左遍歷,因為左邊界數值越大越好(越靠右),這樣就給前乙個區間的空間就越大,所以可以從右向左遍歷。

如果按照左邊界排序,還從左向右遍歷的話,要處理各個區間右邊界的各種情況。

一些同學做這道題目可能真的去模擬去重複區間的行為,這是比較麻煩的,還要去刪除區間。

題目只是要求移除區間的個數,沒有必要去真實的模擬刪除區間!

「我來按照右邊界排序,從左向右記錄非交叉區間的個數。最後用區間總數減去非交叉區間的個數就是需要移除的區間個數了」。

此時問題就是要求非交叉區間的最大個數。

區域性最優推出全域性最優,試試貪心!

這裡記錄非交叉區間的個數還是有技巧的,如圖:

區間,1,2,3,4,5,6都按照右邊界排好序。

每次取非交叉區間的時候,都是可右邊界最小的來做分割點(這樣留給下乙個區間的空間就越大),所以第一條分割線就是區間1結束的位置。

接下來就是找大於區間1結束位置的區間,是從區間4開始。「那有同學問了為什麼不從區間5開始?別忘已經是按照右邊界排序的了」。

區間4結束之後,在找到區間6,所以一共記錄非交叉區間的個數是三個。

總共區間個數為6,減去非交叉區間的個數3。移除區間的最小數量就是3。

public

static

interaseoverlapintervals

(int

intervals)

// 按照區間右邊界排序

arrays

.sort

(intervals,

newcomparator

<

int[

]>()

else

if(o1[1]

)return0;

}});

int count=1;

// 記錄非交叉區間的個數

int end=intervals[0]

[1];

// 記錄區間分割點

for(

int i =

0; i < intervals.length-

1; i++)}

return intervals.length-count;

}

參考:

leetcode 435 無重疊區間

給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。輸入 1,2 2,3 3,4 1,3 輸出 1 解釋 移除 1,3 後,剩下的區間沒有重疊。輸入 1,2 1,2 1,2 輸出 2 解釋 你需要移除兩個 1,2 來使剩下的區間沒有重疊。輸入 1,2 2,3 輸出 0 解釋 你不需要...

leetcode435無重疊空間

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

LeetCode 435 無重疊區間

這道題目是在給定的集合中找到需要去掉的區間最小數量,使得剩餘區間互相不重疊,題目如下 這道題目似乎無從下手,因為找重疊的區域確實是比較麻煩的。我們可以嘗試用貪心演算法來解答這個問題,我們假設有集合 int erva ls 1,2 3 5 2,3 3 6 7,8 6 7 intervals 1,2 3...