zoukankan      html  css  js  c++  java
  • [LeetCode][JavaScript]Insert Interval

    Insert Interval

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

    You may assume that the intervals were initially sorted according to their start times.

    Example 1:
    Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

    Example 2:
    Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

    This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

    https://leetcode.com/problems/insert-interval/


    Javascript return的格式是错的,好坑啊。

    情况比较多,先全部列出来,大致上是五种,然后找找规律。

    1. newInterval可以直接放进去,没有重叠

    console.log(JSON.stringify(insert([{start:3,end:4}], {start:5,end:6})) == JSON.stringify([[3,4],[5,6]]));
    console.log(JSON.stringify(insert([{start:5,end:6}], {start:3,end:4})) == JSON.stringify([[3,4],[5,6]]));
    console.log(JSON.stringify(insert([{start:3,end:4}, {start:8,end:9}], {start:6,end:7})) == JSON.stringify([[3,4],[6,7],[8,9]]));

    2.newInterval与一个区间交叉

    console.log(JSON.stringify(insert([{start:3,end:8}], {start:1,end:5})) == JSON.stringify([[1,8]]));
    console.log(JSON.stringify(insert([{start:3,end:8}], {start:5,end:10})) == JSON.stringify([[3,10]]));

    3.newInterval 与左右2个区间交叉

    console.log(JSON.stringify(insert([{start:3,end:5}, {start:9,end:11}], {start:4,end:10})) == JSON.stringify([[3,11]]));

    4.newInterval “吃掉”了一个或多个区间

    console.log(JSON.stringify(insert([{start:3,end:5}, {start:7,end:8}], {start:2,end:9})) == JSON.stringify([[2,9]]));

    5.既有交叉,又“吃掉”了区间

    console.log(JSON.stringify(insert([{start:3,end:5}, {start:6,end:7},{start:9,end:11}], {start:4,end:10})) == JSON.stringify([[3,11]]));
    console.log(JSON.stringify(insert([{start:1,end:3}, {start:5,end:6}], {start:2,end:7})) == JSON.stringify([[1,7]]));

    遍历给定数组里的所有区间,总结下来是4种情况,

    当前区间记做curr,需要插入的区间记做newInterval

    1. curr.end小于newInterval.start,curr可以直接塞进结果;

    2. newInterval.end小于curr.start,newInterval和curr都要塞进结果;

    3. newInterval的start或者end与curr交叉,merge两个区间,start以小的为准,end以大的为准;

    4. newInterval“吃掉了”curr,什么都不做。

    解法:

    /**
     * Definition for an interval.
     * function Interval(start, end) {
     *     this.start = start;
     *     this.end = end;
     * }
     */
    /**
     * @param {Interval[]} intervals
     * @param {Interval} newInterval
     * @return {Interval[]}  !!!!!!! wrong format
     */
    var insert = function(intervals, newInterval) {
        var res = [];
        var isInserted = false;
        for(var i = 0; i < intervals.length; i++){
            var curr = intervals[i];
            if(curr.end < newInterval.start || isInserted){
                res.push([curr.start, curr.end]);
            }else if(newInterval.end < curr.start && !isInserted){
                res.push([newInterval.start, newInterval.end]);
                res.push([curr.start, curr.end]);
                isInserted= true;
            }else if(curr.start <= newInterval.start || newInterval.end <= curr.end){ //merge
                newInterval.start = Math.min(curr.start, newInterval.start);
                newInterval.end = Math.max(curr.end, newInterval.end);
            }else{
                // newInterval eat curr
            }
        }
    
        if(!isInserted){
            res.push([newInterval.start, newInterval.end]);
        }
    
        return res;
    };
  • 相关阅读:
    dp的冗余(选数类)
    noip2016自测报告
    dalao高精
    二叉苹果树
    最长上升子序列加强版
    Above the Median
    树状数组学习笔记
    Java委托机制
    Java集合
    Java异常
  • 原文地址:https://www.cnblogs.com/Liok3187/p/4508084.html
Copyright © 2011-2022 走看看