[LeetCode] 57. Insert Interval

題目鏈接: https://leetcode.com/problems/insert-interval/description/

Description

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].

解題思路

題意大致爲在一個已經排序過的相互無交集的區間數組中,添加一個新的區間,將有交集的區間全部合併成一個新的區間。

題目不是很難,注意下細節就可以了。遍歷初始區間數組,對每一個區間判斷與目標區間是否有交集,交集的判定可以歸結爲三種,兩種括號表示兩個不同的區間

  • (---<--)--->
  • <---(-->---)
  • <---(--)--->

有交集的區間個數可以通過另一個迭代器來記錄,每發現一個區間有交集迭代器就加一,直到無交集或者到達數組末尾爲止,刪除該數組區間,再在此位置插入新的區間。

另外,還要考慮新區間與原來數組中的區間都沒有交集的情況。通過比較新區間的 end 是否小於該輪第一個區間的 start 來判斷是否有交集,涵蓋了每個原數組區間前面的空隙,不包括最後一個區間後面的間隙,因此還要單獨比較新區間 start 和原數組中最後一個區間的 end

Code

class Solution {
  public:
    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
        if (intervals.empty()) {
            intervals.push_back(newInterval);
        } else {
            for (auto it = intervals.begin(); it != intervals.end(); ++it) {
                auto eit = it;
                int start = newInterval.start;
                int end = newInterval.end;

                while (eit != intervals.end()) {
                    if ((start <= eit->end && start >= eit->start) ||
                        (end >= eit->start && end <= eit->end) ||
                        (start <= eit->start && end >= eit->end)) {
                        start = min(start, eit->start);
                        end = max(end, eit->end);
                        eit++;
                    } else {
                        break;
                    }
                };

                if (eit != it || end < it->start) {
                    it = intervals.erase(it, eit);
                    intervals.insert(it, Interval(start, end));
                    break;
                } else if (it + 1 == intervals.end() && start > it->end) {
                    intervals.insert(it + 1, Interval(start, end));
                    break;
                }
            }

        }

        return intervals;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章