美文网首页
区间合并算法

区间合并算法

作者: 划水者 | 来源:发表于2019-05-07 10:34 被阅读0次

    输入一批区间,输出合并后的区间

    示例:

    输入: [[1,3],[2,6],[8,10],[15,18]]

    输出: [[1,6],[8,10],[15,18]]

    解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]

    算法描述:

       第一步,必须先排序,根据区间的起始start来排序。

       第二部,当我们有了有序的区间集合后,就可以遍历每个区间。定义待入队的基准区间(最开始为第一个区间),并且比较目前遍历到的区间的start是否小于等于待入队基准区间end。如果是,那这两个区间可以合并了,修改基准区间的end。否则,这个待入队的基准区间可以直接加入结果队列,然后更新待入队基准区间为刚遍历的区间。

    代码demo:

    /**

    * 2019/5/6 下午5:45

    *

    * @author Jungler

    * @since

    */

    public class Solution {

    public static void main(String[] args) {

    Interval interval1 = new Interval(1,3);

    Interval interval2 = new Interval(2,4);

    List<Interval> intervals = new ArrayList<>();

    intervals.add(interval1);

    intervals.add(interval2);

    List<Interval> res = merge(intervals);

    res.forEach(p->System.out.println(p));

    }

    public static List<Interval> merge(List<Interval> intervalList){

    List<Interval> res = new ArrayList<>();

    Collections.sort(intervalList, new Comparator<Interval>() {

    @Override

    public int compare(Interval o1, Interval o2) {

    return o1.getStart() - o2.getStart();

    }

    });

    //定义第一个合并后的区间开始

    int start = intervalList.get(0).getStart();

    //定义第一个合并后的区间结束

    int end = intervalList.get(0).getEnd();

    for(Interval i : intervalList){

    //如果当前遍历到的区间start小于合并后的区间end,说明当前区间和合并后的区间存在重合

    if(i.getStart() <= end){

    //需要把重合的区间合并到合并后的区间中

    end = Math.max(end, i.getEnd());

    } else {

    //else说明当前和要合并的区间没有重合,把合并后的区间加入到res中,并重置合并后的区间start和end

    res.add(new Interval(start, end));

    start = i.getStart();

    end = i.getEnd();

    }

    }

    res.add(new Interval(start, end));

    return res;

    }

    }

    class Interval{

    private int start;

    private int end;

    public Interval(int start, int end) {

    this.start = start;

    this.end = end;

    }

    public int getStart() {

    return start;

    }

    public void setStart(int start) {

    this.start = start;

    }

    public int getEnd() {

    return end;

    }

    public void setEnd(int end) {

    this.end = end;

    }

    @Override

    public String toString() {

    return "Interval{" +

    "start=" + start +

    ", end=" + end +

    '}';

    }

    }

    相关文章

      网友评论

          本文标题:区间合并算法

          本文链接:https://www.haomeiwen.com/subject/dmosoqtx.html