演算法設計與分析: 4-21 區間相交問題
阿新 • • 發佈:2019-02-02
4-21 區間相交問題
問題描述
給定 x 軸上 n 個閉區間。去掉儘可能少的閉區間,使剩下的閉區間都不相交。
給定 n 個閉區間,程式設計計算去掉的最少閉區間數。
資料輸入:
第一行是正整數 n,表示閉區間數。接下來的 n 行中,每行有 2 個整數,分別表示閉區間的 2 個端點。
Java
import java.util.*;
public class QuJianXiangJiao {
private static class INTERVAL implements Comparable{
int left;
int right;
boolean delete;
public int compareTo(Object o){
INTERVAL interval = (INTERVAL) o;
int result = Integer.compare(right, interval.right);//升序
return result;
}
}
private static int n;
private static List<INTERVAL> intervals;
public static void main(String[] args){
Scanner input = new Scanner(System.in);
while (true){
n = input.nextInt();
intervals = new ArrayList<>(n);
for(int i=0; i<n; i++){
INTERVAL tmp = new INTERVAL();
tmp.left = input.nextInt();
tmp.right = input.nextInt();
if (tmp.left > tmp.right){
int temp = tmp.right;
tmp.right = tmp.left;
tmp.left = temp;
}
intervals.add(tmp);
}
Collections.sort(intervals);
int result = greedy();
System.out.println(result);
}
}
//每次選取右端點座標最小的閉區間,保留該閉區間,並將與其相交的閉區間刪去
private static int greedy(){
int minRight,count=0;
for(int i=0; i<n; i++)
for(int j=i+1; j<n; j++){
minRight = intervals.get(i).right;
if(!intervals.get(i).delete && !intervals.get(j).delete && intervals.get(j).left<=minRight){
count++;
intervals.get(j).delete = true;
}
}
return count;
}
}
Input & Output
3
10 20
10 15
20 15
2
Reference
王曉東《計算機演算法設計與分析》(第3版)P135