LeetCode435. 無重疊區間
阿新 • • 發佈:2018-11-23
LeetCode上提交 執行時間優於100%的提交記錄
給定一個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。
注意:
- 可以認為區間的終點總是大於它的起點。
- 區間 [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
解釋: 你不需要移除任何區間,因為它們已經是無重疊的了。
思路:每個區間當作一個物件,區間物件 元素儲存在 intervals[] 陣列種
1)先對區間物件進行排序
2)對相鄰的兩個區間物件元素進行 取捨/合併 判斷
- 如果前面區間的右邊界小於或等於後面區間的左邊界,不需要合併;如:[1,3] 和 [3,4]
- 如果前面區間的右邊界大於後面區間的左邊界 且小於後面區間的右邊界,舍掉後面的區間;如:[1,3]和[2,4],捨去[2,4]
- 如果前面區間的右邊界大於後面區間的右邊界,舍掉前面的區間;如:[1,5]和[2,4],捨去[1,5]
下面放上原始碼:
package Algorithm.LeetCode; import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; class Interval{ int start; int end; Interval() { start = 0; end = 0; } Interval(int s, int e) { start = s; end = e; } } public class Solution12 { public static int eraseOverlapIntervals(Interval[] intervals) { Arrays.sort(intervals, new Comparator<Interval>() { @Override public int compare(Interval o1, Interval o2) { if(o1.start==o2.start) { return o1.end-o2.end; } return o1.start-o2.start; } }); // for (Interval obj:intervals) { // System.out.println(obj.start+","+obj.end); // } int sum = 0; int next = 1; for(int i = 0;i<intervals.length-1;){ //System.out.println("i="+i); if(i+next>=intervals.length) break; if(intervals[i]!=null){ if(intervals[i].end<=intervals[i+next].start){ intervals[i].end = intervals[i+next].end; i++; next=1; } //刪除後面一個,i不變 else if(intervals[i].end>intervals[i+next].start&&intervals[i].end<intervals[i+next].end){ intervals[i+next]=null; next++; sum++; //System.out.println("sum="+sum); } else{//刪除當前 intervals[i]=null; i++; next=1; sum++; //System.out.println("sum="+sum); } } //節點為空,訪問下一個節點 else { i++; next=1; } } return sum; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str=sc.nextLine(); String []str1=str.split(" "); int len = str1.length; int[] a = new int[len]; for(int i = 0 ;i < len ; i ++){ a[i] = Integer.valueOf(str1[i]); } Interval[] b = new Interval[len/2]; for(int i = 0,j=0 ;i<len/2;i++){ Interval obj = new Interval(a[j],a[j+1]); b[i] = obj; //System.out.println("i="+i+","+"j="+j); j+=2; } System.out.println(eraseOverlapIntervals(b)); } }