56.合并区间Leetcode

文章目录

题目描述

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

示例 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] 可被视为重叠区间。

题目解答

/**
 *思路:
 *1. 将每个区间按照start排序,在排序之后很容易看出那两个区间是重合的
 *2. 如果前一个区间的end大于或者等于后一个区间的start,说明这两个区间是重合的
 *3. 采用这样的方式合并两个区间:取第一个区间的start,两个区间中较大的那个end作为新的区间
 *4. 设一个temp等于第一个区间,遍历剩下的区间,如果遇到重叠的,则将temp更新为merge以后的区间
 *5. 这是还不要把merge加入到list中,因为有可能下一个区间和merge是有重叠的
 *6. 直到遇到下一个区间内和temp不发生重叠的时候,将temp加入到list里面
 *7. temp的值被赋为下一个区间
 *
 * 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 {
    public List<Interval> merge(List<Interval> intervals) {
        List<Interval> res = new ArrayList<Interval>();
        if(intervals.size() == 0)
            return res;
        
        //对区间按照start进行排序
        Collections.sort(intervals, new Comparator<Interval>(){
            public int compare(Interval a, Interval b){
                return a.start - b.start;
            }
        });
        
        Interval temp = intervals.get(0);
        
        //如果intervals中只有一个元素
        if(intervals.size() == 1){
            res.add(temp);
            return res;
        }
        
        for(int i = 1; i < intervals.size(); i++){
            //判断是否有重叠
            if(temp.end >= intervals.get(i).start){//有重叠
                //合并两个区间
                temp.end = Math.max(temp.end, intervals.get(i).end);
            }else{//如果不重复的话
                res.add(temp);
                temp = intervals.get(i);
            }
        }
        res.add(temp);
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_32682177/article/details/83790844