区间覆盖线段的总长度 java_区间覆盖问题

该博客介绍了如何使用Java解决区间覆盖问题。首先对输入的n个可能重合的区间按起始点排序,然后合并成互不相交的区间,最后判断给定区间是否与合并后的区间完全重合。代码中包含了一个Comparator用于排序,并提供了合并区间和判断覆盖的函数。
摘要由CSDN通过智能技术生成

[java]代码库package cn.rtdata.mq;

/*

*区间覆盖问题

*输入:n个区间,有可能重合,还有一个区间,判断这个区间是不是与这n个区间完全重合

*输出:true or false

*步骤:先将n个区间按start进行排序O(nlogn),然后根据这些区间的start和end将这些区间合并成为 互相不相交的区间O(n),然后判断给定区间是否与这些不相交的区间完全重叠

import java.util.*;

import cn.rtdata.DataSourceManager;

public class IntervalOverlap {

public static void main(String[] args) {

List intervalList = new ArrayList();

Interval i1 = new Interval(2, 3);

Interval i2 = new Interval(1, 2);

Interval i3 = new Interval(4, 9);

Interval i5 = new Interval(11, 15);

intervalList.add(i1);

intervalList.add(i2);

intervalList.add(i3);

intervalList.add(i5);

Interval i4 = new Interval(1, 6);

System.out.println(whetherOverlap(intervalList, i4));

}

public static List intervalMerger(List intervalList, Interval i,boolean add){

if(intervalList.size()==0||add){

intervalList.add(i);

//return intervalList;

}

Comparator intervalComparator = new Comparator() {

public int compare(Interval o1, Interval o2) {

long temp = o1.start-o2.start;

if(temp==0){

return 0;

}else if(temp>0){

return 1;

}else{

return -1;

}

}

};

Collections.sort(intervalList, intervalComparator);

for (int j = 0; j < intervalList.size() - 1; j++) {

Interval i1 = intervalList.get(j);

Interval i2 = intervalList.get(j + 1);

if (i1.end >= i2.start-1) {

i1.end = i2.end;

intervalList.remove(j + 1);

j--;

}

}

return intervalList;

}

/**

*区间是否在已有区间内

*/

public static boolean whetherOverlap(List intervalList, Interval i) {

if(intervalList.size()==0)

return false;

intervalList = intervalMerger(intervalList,i,false);

for (int j = 0; j < intervalList.size(); j++) {

Interval interval = (Interval) intervalList.get(j);

if (interval.start <= i.start && interval.end >= i.end)

return true;

}

return false;

return true;

}

}

package cn.rtdata.mq;

import java.io.Serializable;

/**

*区间对象

*/

public class Interval implements Serializable{

/**

*

*/

private static final long serialVersionUID = 1L;

long start;

long end;

public Interval(long start, long end) {

this.start = start;

this.end = end;

}

}

694748ed64b9390909c0d88230893790.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值