区间合并

题目描述

给定 n 个区间 [li,ri],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3]和[2,6]可以合并为一个区间[1,6]。

输入格式
第一行包含整数n。

接下来n行,每行包含两个整数 l 和 r。

输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。

数据范围
1≤n≤100000,
−109≤li≤ri≤109
输入样例:
5
1 2
2 4
5 6
7 8
7 9
输出样例:
3

解决思路

首先按照左区间排序,然后依次扫描连接。
重点在于排序只剩下了三种情况(完全在区间内,区间右交叉,区间不相交)。

//package No1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Main{
	public static void main(String[] args) throws IOException{
		StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));
		in.nextToken();
		int n=(int)in.nval;
		ArrayList<zb> list=new ArrayList();
		for(int i=0;i<n;i++){
			in.nextToken();
			int l=(int)in.nval;
			in.nextToken();
			int r=(int)in.nval;
			list.add(new zb(l,r));
		}
		Collections.sort(list,new Comparator<zb>(){
			public int compare(zb a,zb b){
				return a.l-b.l;
			}
		});
		int res=0;
		int start=list.get(0).l;
		int end=list.get(0).r;
		res++;
		for(int i=1;i<list.size();i++){
			zb t=list.get(i);
			if(t.l<=end){
				end=Math.max(t.r, end);
			}else{
				res++;
				start=t.l;
				end=t.r;
			}
		}
		out.println(res);
		out.flush();
		
		
	}
}
class zb{
	int l,r;
	public zb(int l,int r){
		this.l=l;
		this.r=r;
	}
}

你可能感兴趣的:(ACM)