LeetCode第57题:插入区间(中等)

LeetCode第57题:插入区间(中等)

  • 题目:给出一个无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
  • 解法一:把要插入的数组放在最后,利用昨天的解法进行合并。
class Solution {
    private static class Interval {
        int start;
        int end;
        Interval(int[] interval) {
            this.start = interval[0];
            this.end = interval[1];
        }

        int[] toArray() {
            return new int[]{this.start, this.end};
        }
    }

    private static class IntervalComparator implements Comparator<Interval> {

        @Override
        public int compare(Interval a, Interval b) {
            return Integer.compare(a.start, b.start);
        }
    }

    public int[][] insert(int[][] intervals, int[] newInterval) {
        List<Interval> intervalsList = new LinkedList<>();
        for (int[] interval : intervals) {
            intervalsList.add(new Interval(interval));
        }
        intervalsList.add(new Interval(newInterval));
        intervalsList.sort(new IntervalComparator());

        LinkedList<Interval> merged = new LinkedList<>();
        for (Interval interval : intervalsList) {
            // if the list of merged intervals is empty or if the current
            // interval does not overlap with the previous, simply append it.
            if (merged.isEmpty() || merged.getLast().end < interval.start) {
                merged.add(interval);
            }
            // otherwise, there is overlap, so we merge the current and previous
            // intervals.
            else {
                merged.getLast().end = Math.max(merged.getLast().end, interval.end);
            }
        }

        int i = 0;
        int[][] result = new int[merged.size()][2];
        for (Interval mergedInterval : merged) {
            result[i] = mergedInterval.toArray();
            i++;
        }
        return result;
    }
}

在这里插入图片描述

  • 解法二:贪心算法,先将比新数组小的数组加入,再合并后面的几项。
class Solution {
  public int[][] insert(int[][] intervals, int[] newInterval) {
    // init data
    int newStart = newInterval[0], newEnd = newInterval[1];
    int idx = 0, n = intervals.length;
    LinkedList<int[]> output = new LinkedList<int[]>();

    // add all intervals starting before newInterval
    while (idx < n && newStart > intervals[idx][0])
      output.add(intervals[idx++]);

    // add newInterval
    int[] interval = new int[2];
    // if there is no overlap, just add the interval
    if (output.isEmpty() || output.getLast()[1] < newStart)
      output.add(newInterval);
    // if there is an overlap, merge with the last interval
    else {
      interval = output.removeLast();
      interval[1] = Math.max(interval[1], newEnd);
      output.add(interval);
    }

    // add next intervals, merge with newInterval if needed
    while (idx < n) {
      interval = intervals[idx++];
      int start = interval[0], end = interval[1];
      // if there is no overlap, just add an interval
      if (output.getLast()[1] < start) output.add(interval);
      // if there is an overlap, merge with the last interval
      else {
        interval = output.removeLast();
        interval[1] = Math.max(interval[1], end);
        output.add(interval);
      }
    }
    return output.toArray(new int[output.size()][2]);
  }
}

作者:LeetCode
链接:https://leetcode-cn.com/problems/insert-interval/solution/cha-ru-qu-jian-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

  • 解法三:评论里的解法,我觉得挺好,把原来的数组分成三部分,小于第一个数的,大于最后的,和重叠的。再对重叠部分进行合并。
class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        if (intervals==null || intervals.length==0){
            List<int[]> l1=new ArrayList<>();
            l1.add(newInterval);
            return l1.toArray(new int[0][]);
        }

        int start=-1,end=-1;
        boolean s=false,e=false;
        List<int[]> l1=new ArrayList<>();
        for (int i=0;i<intervals.length;i++){
            if (newInterval[0]<=intervals[i][1]){
                start=i;
                s= newInterval[0] >= intervals[i][0];
                break;
            }
            else
                l1.add(intervals[i]);
        }
        List<int[]> l2=new ArrayList<>();
        for (int i=intervals.length-1;i>=0;i--){
            if (newInterval[1]>=intervals[i][0]){
                end=i;
                e=newInterval[1] <= intervals[i][1];
                break;
            }
            else
                l2.add(0,intervals[i]);
        }

        int a=0,b=0;
        if (start==-1 || end==-1){
            l1.add(new int[] {newInterval[0],newInterval[1]});
            l1.addAll(l2);
            return l1.toArray(new int[0][]);
        }
        if (s)
            a=Math.min(newInterval[0],intervals[start][0]);
        else
            a=newInterval[0];
        if (e)
            b=Math.max(newInterval[1],intervals[end][1]);
        else
            b=newInterval[1];
        l1.add(new int[] {a,b});
        l1.addAll(l2);
        return l1.toArray(new int[0][]);
    }
}

作者:wei-yu-13
链接:https://leetcode-cn.com/problems/insert-interval/solution/10092-by-wei-yu-13/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

发布了79 篇原创文章 · 获赞 7 · 访问量 1381

猜你喜欢

转载自blog.csdn.net/new_whiter/article/details/104169660
今日推荐