区间合并模板
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;
;
以上是关于区间合并模板的主要内容,如果未能解决你的问题,请参考以下文章