用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

区间覆盖问题

2012-11-27 作者: 大漠孤烟举报

[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<Interval> intervalList = new ArrayList<Interval>();
        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<Interval> intervalMerger(List<Interval> intervalList, Interval i,boolean add){
    	if(intervalList.size()==0||add){
    		intervalList.add(i);
    		//return intervalList;
    	}
    	
        Comparator<Interval> intervalComparator = new Comparator<Interval>() {
            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<Interval> 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;
    }
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...