patatoforsyj
合并区间
 
 

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

 

思路:观察各个区间,既然要对区间排列,首先对区间排序,使其按照左端点的大小进行排列。这里要用到数据结构的Collections.sort来进行排序。

  需要了解Collections.sort( list ,new Comparator<  >()  );的排序写法。  注意这里很容易出错。

  排序完之后,进行区间的划分。 首先将第一个区间作为比较区间temp

遍历整个List。 存在以下情况:1.如果temp的左端点和遍历区间的左端点不相交,当前temp加入数组,更新temp。

              2.如果相交,那么当前区间的右端点小于遍历数组的右端点,更新temp的右端点。

              因为区间按照左端点排序,不需要再处理左端点。

              3.相交之下,如果当前区间右端点包含遍历区间,什么也不用做。

              遍历完之后,把temp加入list。

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
class Solution {List<Interval> list=new ArrayList();
    public List<Interval> merge(List<Interval> intervals) {
        if(intervals.size()==0)return list;         //list为空的情况,直接判出。
        //Collections.sort()的具体用法。 比较对象是Interval这个类。最后将表按照左端点的顺序排列
       Collections.sort(intervals,new Comparator<Interval>(){
          public int compare(Interval a,Interval b){
              return a.start-(b.start);
          }
       });
        Interval temp=intervals.get(0);
        for(Interval aa:intervals){         //遍历表,判断3种条件。
            if(temp.end<aa.start){
                list.add(temp);
                temp=aa;
            }else {
                if(temp.end>=aa.end){
                    temp=temp;
                }else{
                    temp.start=temp.start;
                   temp.end=aa.end;
                }
            }
            
        }
        list.add(temp);
        return list;
    }
   
}

 

相关文章: