1. 程式人生 > 實用技巧 >435.無重疊區間

435.無重疊區間

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

注意:

可以認為區間的終點總是大於它的起點。
區間 [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(如果有的話),於是命題得證。

class
Solution { 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; //長度 - 最多不重疊的區間,即為最少消除的區間 } }