LeetCode 57 - Insert Interval
題目
題目連結:https://leetcode.com/problems/insert-interval/
給定一個集合的區間,插入一個新的區間並輸出結果。已知給定的區間都不重疊且已經由左到右排好。
範例說明
Example 1:
1 | Input: intervals = [[1,3],[6,9]], newInterval = [2,5] |
Example 2:
1 | Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8] |
想法
假設原區間為 interval
,新區間為 newInterval
。且區間的左邊界為 interval.left
、右邊界為 interval.right
。
首先:
- 若新區間的左邊界在一個某一原區間中,即
interval.left <= newInterval.left <= interval.right
:
則將newInterval.left
延伸至interval.left
並不會使答案改變。 - 若新區間的右邊界在一個某一原區間中,即
interval.left <= newInterval.right <= interval.right
:
則將newInterval.left
延伸至interval.right
並不會使答案改變。
做到上述兩點後,可以發現若原區間若與新區間重疊,則必定被包覆在新區間之中。
所以原區間與新區間的關係只剩下三種:
- 與新區間不重疊且在新區間的左側,即
interval.right > newInterval.left
:
則直接將原區間保留在新區間的左側。 - 與新區間不重疊且在新區間的右側,即
interval.left < newInterval.right
:
則直接將原區間保留在新區間的右側。 - 與新區間重疊,則原區間被包覆在新區間之中,即
newInterval.left <= interval.left <= interval.right <= newInterval.right
:
則原區間消失。
實作細節
首先,
interval.left <= newInterval.left <= interval.right
,則延伸newInterval.left
,即newInterval.left = interval.left
。interval.left <= newInterval.right <= interval.right
,則延伸newInterval.right
,即newInterval.right = interval.right
。
再來,依序將區間加入一個空的集合 newIntervals
之中,所有不被新區間的原區間都能加入。要注意加入的區間在新區間的左側還是右側。
筆者的作法為先將新區間加入 newIntervals
之中,若原區間在新區間左側,則將 newInterals
的最後一個元素(即 newInterval
)取代成原區間,並再放入一次 newInterval
。
程式碼
1 | /** |