30. 插入區間

描述

Given a non-overlapping interval list which is sorted by start point.

Insert a new interval into it, make sure the list is still in order and non-overlapping (merge intervals if necessary).

您在真實的面試中是否遇到過這個題?  是

樣例

Insert (2, 5) into [(1,2), (5,9)], we get [(1,9)].

Insert (3, 4) into [(1,2), (5,9)], we get [(1,2), (3,4), (5,9)].

這道題讓我們在一系列非重疊的區間中插入一個新的區間,可能還需要和原有的區間合併,那麼我們需要對給區間集一個一個的遍歷比較,那麼會有兩種情況,重疊或是不重疊,不重疊的情況最好,直接將新區間插入到對應的位置即可,重疊的情況比較複雜,有時候會有多個重疊,我們需要更新新區間的範圍以便包含所有重疊,之後將新區間加入結果res,最後將後面的區間再加入結果res即可。具體思路是,我們用一個變量cur來遍歷區間,如果當前cur區間的結束位置小於要插入的區間的起始位置的話,說明沒有重疊,則將cur區間加入結果res中,然後cur自增1。直到有cur越界或有重疊while循環退出,然後再用一個while循環處理所有重疊的區間,每次用取兩個區間起始位置的較小值,和結束位置的較大值來更新要插入的區間,然後cur自增1。直到cur越界或者沒有重疊時while循環退出。之後將更新好的新區間加入結果res,然後將cur之後的區間再加入結果res中即可,參見代碼如下:

代碼:做此題要有耐心

/**
 * Definition of Interval:
 * classs Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this->start = start;
 *         this->end = end;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param intervals: Sorted interval list.
     * @param newInterval: new interval.
     * @return: A new interval list.
     */
    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
        // write your code here
         vector<Interval> res;
        int n = intervals.size(), cur = 0;
        while (cur < n && intervals[cur].end < newInterval.start) {
            res.push_back(intervals[cur++]);
        }
        while (cur < n && intervals[cur].start <= newInterval.end) {
            newInterval.start = min(newInterval.start, intervals[cur].start);
            newInterval.end = max(newInterval.end, intervals[cur].end);
            ++cur;
        }
        res.push_back(newInterval);
        while (cur < n) {
            res.push_back(intervals[cur++]);
        }
        return res;
    }
};

 

發佈了79 篇原創文章 · 獲贊 110 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章