美文网首页
Leetcode-56:合并区间

Leetcode-56:合并区间

作者: 小北觅 | 来源:发表于2019-01-18 21:26 被阅读62次

    题目描述:
    给出一个区间的集合,请合并所有重叠的区间。

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

    思路:
    首先要做的就是给区间集排序,由于我们要排序的是个结构体,所以我们要定义自己的comparator,才能用sort来排序,我们以start的值从小到大来排序,排完序我们就可以开始合并了,首先把第一个区间存入结果中,然后从第二个开始遍历区间集,如果结果中最后一个区间和遍历的当前区间无重叠,直接将当前区间存入结果中,如果有重叠,将结果中最后一个区间的end值更新为结果中最后一个区间的end和当前end值之中的较大值,然后继续遍历区间集,以此类推可以得到最终结果。

    给两种实现吧,主要是对列表遍历时的操作不同。思想是一样的

    /**
     * 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 || intervals==null)
                return res;
            Collections.sort(intervals, new Comparator<Interval>(){
                public int compare(Interval o1, Interval o2){
                    return o1.start - o2.start;
                }
            });
            
            res.add(intervals.get(0));
            
            for(int i=1;i<intervals.size();++i){
                //无重叠
                if(res.get(res.size()-1).end < intervals.get(i).start){
                    res.add(intervals.get(i));
                }else{
                    res.get(res.size()-1).end =Math.max(intervals.get(i).end, res.get(res.size()-1).end);
                }
            }
            return res;
            
        }
    }
    
    /**
     * 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> result = new LinkedList<>();
    
            if (intervals == null || intervals.size() < 1) {
                return result;
            }
    
            // 先对区间进行排序,使用一个匿名内部类
            Collections.sort(intervals, new Comparator<Interval>() {
                @Override
                public int compare(Interval o1, Interval o2) {
                    return o1.start - o2.start;
                }
            });
    
            // 排序后,后一个元素(记为next)的start一定是不小于前一个(记为prev)start的,
            // 对于新加入的区间,假设next.start大于prev.end就说明这两个区间是分开的,要添
            // 加一个新的区间。否则说明next.start在[prev.start, prev.end]内。则仅仅要看
            // next.end是否是大于prev.end,假设大于就要合并区间(扩大)
            Interval prev = null;
            for (Interval item : intervals) {
    
                if (prev == null || prev.end < item.start) {
                    result.add(item);
                    prev = item;
                } else if (prev.end < item.end) {
                    prev.end = item.end;
                }
            }
    
            return result;
        }
        
        
    }
    

    相关文章

      网友评论

          本文标题:Leetcode-56:合并区间

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