区间合并

    技术2022-07-16  81

    题目描述

    给定 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; } }
    Processed: 0.021, SQL: 9