区间合并模板

目录

模板:

题目:

代码:


模板:

// 将所有存在交集的区间合并

public static void merge(ArrayList<PII> segs) {
        ArrayList<PII> res=new ArrayList<>();
         //排序
        Collections.sort(segs,new Comparator<PII>() {
            @Override
            public int compare(PII o1, PII o2) {
                int flag;
                flag=o1.bgin-o2.bgin;
                if(flag==0) {
                    flag=o1.end-o2.end;
                }
                return flag;
            }
        });
        //最左最右边界初始化
        int st=(int) -1e9,ed=(int)-1e9;
        for(int i=0;i<segs.size();i++) {
            PII pii = segs.get(i);
            //如果维护的区间和枚举的区间没有任何交集 就加入
            if(ed<pii.getBgin()) {
                if(st!=-1e9)    res.add(pii);
                st=pii.bgin;
                ed=pii.end;
            }
            //有交集只要把右交点更新为最大即可
            else ed=Math.max(ed, pii.end);
        }
        //最后一个区间后面没有比较的,要加入进去
        if(st!=-1e9) {
            PII pii=new PII(st,ed);
            res.add(pii);
        }
        System.out.println(res.size());
    }

题目:

 

代码:

 

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



public class Main {
	static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	static int N=100010;
	static int n;
	static ArrayList<PII> segs=new ArrayList<>();
	
	public static void main(String[] args) throws IOException {
		n=Integer.parseInt(br.readLine());
		String[] st;
		for(int i=0;i<n;i++) {
			st=br.readLine().split(" ");
			int l=Integer.parseInt(st[0]);
			int r=Integer.parseInt(st[1]);
			PII pii = new PII(l,r);
			segs.add(pii);
		}
		merge(segs);
		
	}

	public static void merge(ArrayList<PII> segs) {
		ArrayList<PII> res=new ArrayList<>();
		 //排序
        Collections.sort(segs,new Comparator<PII>() {
			@Override
			public int compare(PII o1, PII o2) {
				int flag;
				flag=o1.bgin-o2.bgin;
				if(flag==0) {
					flag=o1.end-o2.end;
				}
				return flag;
			}
		});
        //最左最右边界初始化
        int st=(int) -1e9,ed=(int)-1e9;
        for(int i=0;i<segs.size();i++) {
        	PII pii = segs.get(i);
        	//如果维护的区间和枚举的区间没有任何交集 就加入
        	if(ed<pii.getBgin()) {
        		if(st!=-1e9)	res.add(pii);
        		st=pii.bgin;
        		ed=pii.end;
        	}
        	//有交集只要把右交点更新为最大即可
        	else ed=Math.max(ed, pii.end);
        }
        //最后一个区间后面没有比较的,要加入进去
        if(st!=-1e9) {
        	PII pii=new PII(st,ed);
        	res.add(pii);
        }
        System.out.println(res.size());
	}
}
class PII{
	int bgin,end;
	PII(){}
	public PII(int bgin, int end) {
		super();
		this.bgin = bgin;
		this.end = end;
	}
	public int getBgin() {
		return bgin;
	}
	public void setBgin(int bgin) {
		this.bgin = bgin;
	}
	public int getEnd() {
		return end;
	}
	public void setEnd(int end) {
		this.end = end;
	};
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪八戒1.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值