leetcode——困難——57.插入區間(JavaScript)
阿新 • • 發佈:2018-11-23
給出一個無重疊的 ,按照區間起始端點排序的區間列表。
在列表中插入一個新的區間,你需要確保列表中的區間仍然有序且不重疊(如果有必要的話,可以合併區間)。
示例 1:
輸入: intervals = [[1,3],[6,9]], newInterval = [2,5]
輸出: [[1,5],[6,9]]
示例 2:
輸入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8] 輸出: [[1,2],[3,10],[12,16]] 解釋: 這是因為新的區間 [4,8] 與 [3,5],[6,7],[8,10] 重疊。
思路:
迴圈每個interval,判斷他們與newInterval的位置關係,然後確定要加入結果陣列的interval。
每個 interval.end 的位置有三種可能:
1、 interval.end < newInterval.start
說明這個 interval 在 newInterval 的左側,沒有重疊區間
2、 newInterval.start <= interval.end <= newInterval.start 說明 interval 的尾部在新區間內部,那麼肯定就有重疊的部分了,此時再分為兩種情況: 2.1 interval.start < newInterval.start 說明現在是有交集但不包含的關係,例如 [1,5] 和 [2,7],需要更新 [2,7] 為 [1,7] 也即 newInterval.start = interval.start 2.2 interval.start >= newInterval.start 說明現在是包含關係,例如 [3,5] 和 [1,7],什麼也不用做。
3、 interval.end > newInterval.end
說明interval 尾部在右側。此時分為三種情況
3.1 interval.start < newInterval.start 說明interval 包含 newInterval,更新 newInterval 的首尾 3.2 newInterval.start <= interval.start <= newInterval.end 說明相交但不包含,只需更新 newInterval 的尾部 3.3 interval.start > newInterval.end 說明不相交,且在右側,此時要判斷 newInterval是否已經加入結果陣列,若沒有,則加入,並且還得把當前的 interval 加入結果陣列。
迴圈遍歷完畢後再此判斷 newInterval 是否加入結果陣列。
整體程式碼:
/**
* Definition for an interval.
* function Interval(start, end) {
* this.start = start;
* this.end = end;
* }
*/
/**
* @param {Interval[]} intervals
* @param {Interval} newInterval
* @return {Interval[]}
*/
var insert = function(intervals, newInterval) {
let addNew = false; // 表示是否已經將newInterval新增至結果陣列
let result = [];
for (let i of intervals) {
if (i.end < newInterval.start) {
result.push(i);
} else if (i.end <= newInterval.end) {
if (i.start < newInterval.start) {
newInterval.start = i.start
} else {
// i.start >= newInterval.start
// do nothing
}
} else { // i.end > newInterval.end
if (i.start < newInterval.start) {
newInterval.start = i.start;
newInterval.end = i.end;
} else if (i.start >= newInterval.start && i.start <= newInterval.end) {
newInterval.end = i.end;
} else {
// i.start > newInterval.end
if (!addNew) {
result.push(newInterval)
addNew = true;
}
result.push(i)
}
}
}
if (!addNew) {
result.push(newInterval)
}
return result;
};