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 | /** |