算法 数学区间求并集

来源:互联网 发布:android滑动解锁源码 编辑:程序博客网 时间:2024/06/07 04:43
例如:有区间[3,7],[11,12],[14,16],[17,19],[21,24],[1,2],[4,8],[5,6],[9,10],[13,15],[18,22],[20,23]
将区间放入List<Long> list中:
list.add(3);
list.add(7);
list.add(11);
......
list中数据格式如下3,7,11,12,14,16,17,19,21,24,1,2,4,8,5,6,9,10,13,15,18,22,20,23
然后直接调用函数
GetCombinedSets(list,0);

list即为输出。


public void GetCombinedSets(List<Long> list,int index){int i=index;boolean isbreak=false;for(;i<list.size()-2;i+=2){if(isbreak){i-=2;break;}Long   start  =list.get(i);    Long   end  =list.get(i+1);for(int j=i+2;j<list.size();j+=2){Long nextstart=list.get(j);  Long nextend=list.get(j+1);if(start>nextend || end<nextstart){continue;}//          |dstart_____|    or   |dstart_____|  //      |cstart_____|       or |cstart_________|if(start>nextstart){//          |_____|    //      |_____|       if(end>=nextend){list.set(i,nextstart);list.remove(j); list.remove(j);isbreak=true;break;}else{//          |_____|    //      |_____________|  list.set(i,nextstart);  list.set(i+1,nextend);list.remove(j); list.remove(j);isbreak=true;break;}}else{//      |_____________|    //        |_____|if(end>=nextend){list.remove(j); list.remove(j);isbreak=true;break;}else{//      |________|    //        |_________| list.set(i+1,nextend);list.remove(j); list.remove(j);isbreak=true;break;}}}}if(i==list.size()-2){return;}GetCombinedSets(list,i);}


原创粉丝点击