区间合并模板

Posted 猪八戒1.0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间合并模板相关的知识,希望对你有一定的参考价值。

目录

模板:

题目:

代码:


模板:

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

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;
	;
	

以上是关于区间合并模板的主要内容,如果未能解决你的问题,请参考以下文章

算法基础:区间合并算法及模板应用

线段树区间合并(模板)

石子合并 区间DP模板题

区间dp(石子合并)模板题

石子合并2——区间DP这是道经典入门例题/试手模板

区间dp -- 典型模板,石子合并