標籤:
https://leetcode.com/problems/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].
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]]));
解法:
/** * 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;};
[LeetCode][JavaScript]Insert Interval