20201231 無重疊區間

2022-06-20 04:21:10 字數 1930 閱讀 7565

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

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

區間 [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解釋: 你不需要移除任何區間,因為它們已經是無重疊的了。//

public

int eraseoverlapintervals(int

intervals)

思路(錯誤):將區間存入map 起始區間相同的區間小的存入 出現起始區間相同的返回的值++

錯誤案例:[[1,100],[11,22],[1,11],[2,12]] 預期結果2

因為重疊區間可能不是從起始區間開始 如上的[1,11],[2,12]

public

int eraseoverlapintervals(int

intervals)

else

if(integer.parseint(map.get(intervals[i][0])+"")<=intervals[i][1])

j--;

}return

j; }

大佬思路

貪心演算法

什麼是貪心選擇性質呢,簡單說就是:每一步都做出乙個區域性最優的選擇,最終的結果就是全域性最優。注意哦,這是一種特殊性質,其實只有一部分問題擁有這個性質。

比如你面前放著 100 張***,你只能拿十張,怎麼才能拿最多的面額?顯然每次選擇剩下***中面值最大的一張,最後你的選擇一定是最優的。

然而,大部分問題明顯不具有貪心選擇性質。比如打牌,對手出對兒三,按照貪心策略,你應該出盡可能小的牌剛好壓制住對方,但現實情況我們甚至可能會出王炸。這種情況就不能用貪心演算法,而得使用動態規劃解決

正確的思路其實很簡單,可以分為以下三步:

從區間集合 intvs 中選擇乙個區間 x,這個 x 是在當前所有區間中結束最早的(end 最小)。

把所有與 x 區間相交的區間從區間集合 intvs 中刪除。

重複步驟 1 和 2,直到 intvs 為空為止。之前選出的那些 x 就是最大不相交子集。

public

int intervalschedule(int

intvs)

});//至少有乙個區間不相交

int count = 1;

//排序後,第乙個區間就是 x

int x_end = intvs[0][1];

for (int

interval : intvs)

}return

count;

}

public

static

int intervalschedule(int

intvs) , , ,

int n =intvs.length;

if (intvs.length == 0) return 0;

//按 end 公升序排序

arrays.sort(intvs, new comparator()

});//至少有乙個區間不相交

int count = 1;

//排序後,第乙個區間就是 x

int x_end = intvs[0][1];

for (int

interval : intvs)

}return n-count;

}

無重疊區間

給定一些區間,找到需要移除的最小區間數,以使其餘的區間不重疊。樣例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 輸出 ...

無重疊區間

最近做題發現無重疊區間出現的比較多,在此做個記錄,但願你,思維活躍,邏輯縝密,多的不扯,堅持刷題 給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。分析題意,說的是無重疊區間,那就是利用區間數字的大小做判斷唄,所以對整體陣列排序不會對整體結果造成影響。但是對做題人來說那就簡單多了,...

無重疊區間

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