435.無重疊區間
阿新 • • 發佈:2020-11-05
給定一個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。
注意:
可以認為區間的終點總是大於它的起點。
區間 [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
解釋: 你不需要移除任何區間,因為它們已經是無重疊的了。
思路:
• 貪心演算法之區間排程問題。
• 在[ start, end] 中,以 end 的升序排列,去除與當前區間相重疊的區間;
• 則未被刪除的,獨立的區間,就是最終的區間。
• 證明:
【————】 // 我們選取的最早結束的區間
【————】 // 有重疊的可能區間A
【————————————————】 // 有重疊的可能區間B
假設可能區間 A 或 B 參與形成了最長序列,那麼 A,B 之後的區間必然可以與我們選取的區間組合形成最長序列,所以完全可以去掉 A,B(如果有的話),於是命題得證。
classSolution { public int eraseOverlapIntervals(int[][] intervals) { if(intervals.length < 2) return 0; Arrays.sort(intervals, (v1, v2) -> v1[1] - v2[1]); // end 升序排列 int count = 1, n = intervals.length, end = intervals[0][1]; for(int i = 1; i < n; i++){if(intervals[i][0] >= end){ //某一區間的開始時間 >= 基準期間的結束時間 count++; // 不重疊區間個數 + 1 end = intervals[i][1]; //更新基準期間的結束時間 } } return n - count; //長度 - 最多不重疊的區間,即為最少消除的區間 } }