1. 程式人生 > >LeetCode435. 無重疊區間

LeetCode435. 無重疊區間

LeetCode上提交 執行時間優於100%的提交記錄

 

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

注意:

  1. 可以認為區間的終點總是大於它的起點。
  2. 區間 [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));


    }
}