zoukankan      html  css  js  c++  java
  • leetcode56- Merge Intervals- medium

    Given a collection of intervals, merge all overlapping intervals.

    For example,
    Given [1,3],[2,6],[8,10],[15,18],
    return [1,6],[8,10],[15,18].

    先写comparator按照interval的开始时间出现早晚排好序。接着开始遍历每个interval,如果和上一个有交叉(crt.start <= prev.end),那就改上一个的end为更持久的一个,如果和上一个没有交叉,那就把之前记录的间隔推入结果中,重新开始新的检查。

    细节:发现交叉的时候不是直接把尾赋值为当前的,而是要赋值更长的一个。这样才能避免包含关系下出现逻辑错误。

    1.O(n)空间:

    /**
     * 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 {
        
        private Comparator<Interval> comparator = new Comparator<Interval>(){
            public int compare(Interval i1, Interval i2) {
                return i1.start - i2.start;
            }
        };
        
        public List<Interval> merge(List<Interval> intervals) {
            
            List<Interval> result = new ArrayList<Interval>();
            if (intervals == null || intervals.size() == 0) {
                return result;
            }
            
            Collections.sort(intervals, comparator);
            
            int start = intervals.get(0).start;
            int end = intervals.get(0).end;
            for (int i = 1; i < intervals.size(); i++) {
                Interval crt = intervals.get(i);
                if (crt.start <= end) {
                    end = Math.max(end, crt.end);
                } else {
                    result.add(new Interval(start, end));
                    start = crt.start;
                    end = crt.end;
                }
            }
            result.add(new Interval(start, end));
            
            return result;
        }    
    }

    2.O(1)空间,原地合并

    /**
     * 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 {
        
        private Comparator<Interval> comparator = new Comparator<Interval>(){
            public int compare(Interval i1, Interval i2) {
                return i1.start - i2.start;
            }
        };
        
        public List<Interval> merge(List<Interval> intervals) {
            
            List<Interval> result = new ArrayList<Interval>();
            if (intervals == null || intervals.size() == 0) {
                return result;
            }
            
            Collections.sort(intervals, comparator);
            
            Interval last = intervals.get(0);
            for (int i = 1; i < intervals.size(); i++) {
                Interval crt = intervals.get(i);
                if (crt.start <= last.end) {
                    last.end = Math.max(last.end, crt.end);
                } else {
                    result.add(last);
                    last = crt;
                }
            }
            result.add(last);
            
            return result;
        }    
    }
  • 相关阅读:
    Linux基础命令-cd
    grep和egrep正则表达式
    SpringMVC源码阅读-一个请求主要处理流程DispatcherServlet(四)
    SpringMVC源码阅读-dispatcher组件初始化过程(三)
    SpringMVC源码阅读-Servlet WebApplicationContext初始化(二)
    SpringMVC源码阅读-Root WebApplicationContext初始化(一)
    logback源码阅读-配置文件解析过程(六)
    logback源码阅读-Encoder(五)
    logback源码阅读-Appender(四)
    logback源码阅读-Logger日志生成(三)
  • 原文地址:https://www.cnblogs.com/jasminemzy/p/7820938.html
Copyright © 2011-2022 走看看