【LeetCode】数组系列(间隔)

来源:互联网 发布:剑三新建角色捏脸数据 编辑:程序博客网 时间:2024/05/22 01:32

56. Merge Intervals

题目:interval包含start和end,将重叠部分合并

思路:用start和end标记目前的最后一个,但不急着加到List里面,因为可能有变化,对List操作时间复杂度高。还需要注意对interval类型进行compare函数重写,或是使用匿名比较器。

/** * 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; } * } */public class Solution {    public List<Interval> merge(List<Interval> intervals) {        int len = intervals.size();        if(len < 2) return intervals;        List<Interval> ret = new ArrayList<>();        intervals.sort((i1, i2) -> Integer.compare(i1.start, i2.start));        int start = intervals.get(0).start;        int end = intervals.get(0).end;        for(int i = 0; i < len; i++){            Interval in = intervals.get(i);            if(end >= in.start){                end = Math.max(end, in.end);            }            else{                ret.add(new Interval(start, end));                start = in.start;                end = in.end;            }        }        ret.add(new Interval(start,end));        return ret;    }}

Collections.sort(intervals, new Comparator<Interval>(){            @Override            public int compare(Interval obj0, Interval obj1) {                return obj0.start - obj1.start;            }        });

57. Insert Interval

题目:将一个Interval插入原有有序的Interval序列中,使其依然有序。

思路:在56题基础上进行了一些改进,先将所有end比插入start小的填入List中,然后比较出新的start和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; } * } */public class Solution {    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {        List<Interval> ret = new LinkedList<>();        int start = newInterval.start;        int end  = newInterval.end;        int i = 0;        while(i < intervals.size() && intervals.get(i).end < start){            ret.add(intervals.get(i++));        }        if(i == intervals.size()){            ret.add(new Interval(start, end));            return ret;        }        if(intervals.get(i).start < end){            end = Math.max(intervals.get(i).end, end);        }        start = Math.min(intervals.get(i).start, start);        for(; i < intervals.size(); i++){            Interval in = intervals.get(i);            if(end >= in.start){                if(end < in.end){                    end = in.end;                }            }            else{                ret.add(new Interval(start, end));                start = in.start;                end = in.end;            }        }        ret.add(new Interval(start, end));        return ret;    }}


原创粉丝点击