區間應用: 插入新的區間 Insert Interval_Leetcode #57

更新於 發佈於 閱讀時間約 5 分鐘

題目敘述

題目會給定我們一個已經根據起點升序排列好的輸入陣列 intervals,裡面的每個pair分別代表每個區間的起點和終點。

接下來新插入一個區間newInterval,插入後如果和原本的區間重疊,請把他們合併
要求我們輸出插入後的結果。


題目的原文敘述


測試範例

Example 1:

Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]

新插入的[2, 5][1, 3]有重疊,合併為[1, 5]

所以插入後的結果為
[[1, 5], [6, 9]]

Example 2:

Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
Output: [[1,2],[3,10],[12,16]]
Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].

新插入的[4, 8][3, 5], [6, 7], [8, 10]有重疊,合併為[3, 10]

所以插入後的結果為
[[1,2],[3,10],[12,16]]

約束條件

Constraints:

  • 0 <= intervals.length <= 10^4

輸入陣列的長度介於0~一萬。

  • intervals[i].length == 2

輸入陣列內的每個元素都是一組pair,分別代表區間起點和終點。

  • 0 <= starti <= endi <= 10^5

起點和終點都介於0~十萬之間。

  • intervals is sorted by starti in ascending order.

輸入陣列已經根據起點做好升序排列。

  • newInterval.length == 2

新插入的區間也是一組pair,分別代表區間起點和終點。

  • 0 <= start <= end <= 10^5

起點和終點都介於0~十萬之間。


演算法 掃描與合併


題目已經給了我們一個很強的條件:

輸入的區間都已經依照起點位置排序好


那麼,我們接著只要依序掃描每一個區間,檢查新插入的區間和當下的區間i有沒有重疊?

如果有重疊合併並且計算擴張後的新起點和新終點

如果沒有重疊,依照區間i的起點終點位置判斷在新區間的左邊還是右邊。
把區間i放在新區間的左手邊或者右手邊即可。


程式碼 掃描與合併

class Solution:
def insert(self, intervals, newInterval):

# Constant to help us access start point and end point of interval
START, END = 0, 1

s, e = newInterval[START], newInterval[END]

left, right = [], []

for cur_interval in intervals:

if cur_interval[END] < s:
# current interval is on the left-hand side of newInterval
left += [ cur_interval ]

elif cur_interval[START] > e:
# current interval is on the right-hand side of newInterval
right += [ cur_interval ]

else:
# current interval has overlap with newInterval
# merge and update boundary
s = min(s, cur_interval[START])
e = max(e, cur_interval[END])

return left + [ [s, e] ] + right

複雜度分析 掃描與合併

時間複雜度: 一個線性掃苗,所需時間為O(n)

空間複雜度: 一個新的陣列,存放合併、排序好的所有區間,陣列長度最大為O(n)。


關鍵知識點

題目已經幫我們排序好區間順序
我們只要接著依序檢查區間、(假如有重疊的話)合併區間即可。


Reference:

[1] Insert Interval - LeetCode

avatar-img
92會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
找出區間[1, n] 內的軸心點位置。通過介紹直覺法、改良直覺法和二分搜尋等算法,最終給出了解析解(推導軸心點的公式解),提供了對應的程式碼和參考資料。該問題的最優解是使用解析解,能夠在O(1)的時間複雜度內找到答案。
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
題目敘述 題目會給定一個鏈結串列的起始點,要求我們把其中區間總和為0的部分刪除掉。 例如 1→ 2 → -2 → 3 → 4 裡面有一段是2 → -2 區間總和為零,所以簡化刪除後變成 1→ 3 → 4 題目的原文敘述 測試範例 Example 1: Input: head
題目敘述 題目會給定我們兩個字串。 第一個是指定順序的字串order。 第二個是輸入字串s。 要求我們依據order給定的順序,重新排列s。 如果出現order中沒有出現的字母,任意位置皆可。 合法答案可能不只一組,輸出其中一種即可。 題目的原文敘述 測試範例 Example
題目敘述 題目會給定一棵二元樹的根結點,要求我們判定這是否為一顆合法的奇偶二元樹? 奇偶二元樹的定義: 從上到下依序是第0層、第一層、...、第n層 偶數層裡面的節點值都必須是奇數,而且由左到右嚴格遞增。 奇數層裡面的節點值都必須是偶數,而且由左到右嚴格遞減。 題目的原文敘述 測試
題目敘述 題目會給定一棵二元樹的根結點,要求我們找出這棵二元樹最後一層最左邊的值。 題目的原文敘述 測試範例 Example 1: Input: root = [2,1,3] Output: 1 Example 2: Input: root = [1,2,3,4,null,5,6
找出區間[1, n] 內的軸心點位置。通過介紹直覺法、改良直覺法和二分搜尋等算法,最終給出了解析解(推導軸心點的公式解),提供了對應的程式碼和參考資料。該問題的最優解是使用解析解,能夠在O(1)的時間複雜度內找到答案。
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
題目敘述 題目會給定一個鏈結串列的起始點,要求我們把其中區間總和為0的部分刪除掉。 例如 1→ 2 → -2 → 3 → 4 裡面有一段是2 → -2 區間總和為零,所以簡化刪除後變成 1→ 3 → 4 題目的原文敘述 測試範例 Example 1: Input: head
題目敘述 題目會給定我們兩個字串。 第一個是指定順序的字串order。 第二個是輸入字串s。 要求我們依據order給定的順序,重新排列s。 如果出現order中沒有出現的字母,任意位置皆可。 合法答案可能不只一組,輸出其中一種即可。 題目的原文敘述 測試範例 Example
題目敘述 題目會給定一棵二元樹的根結點,要求我們判定這是否為一顆合法的奇偶二元樹? 奇偶二元樹的定義: 從上到下依序是第0層、第一層、...、第n層 偶數層裡面的節點值都必須是奇數,而且由左到右嚴格遞增。 奇數層裡面的節點值都必須是偶數,而且由左到右嚴格遞減。 題目的原文敘述 測試
題目敘述 題目會給定一棵二元樹的根結點,要求我們找出這棵二元樹最後一層最左邊的值。 題目的原文敘述 測試範例 Example 1: Input: root = [2,1,3] Output: 1 Example 2: Input: root = [1,2,3,4,null,5,6
你可能也想看
Google News 追蹤
Thumbnail
/ 大家現在出門買東西還會帶錢包嗎 鴨鴨發現自己好像快一個禮拜沒帶錢包出門 還是可以天天買滿買好回家(? 因此為了記錄手機消費跟各種紅利優惠 鴨鴨都會特別注意銀行的App好不好用! 像是介面設計就是會很在意的地方 很多銀行通常會為了要滿足不同客群 會推出很多App讓使用者下載 每次
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
魔鬼藏在二分搜尋裡!輸出值代表的意含、題意產生的邊界條件,寫完模板才是挑戰的開始 Orz
Thumbnail
/ 大家現在出門買東西還會帶錢包嗎 鴨鴨發現自己好像快一個禮拜沒帶錢包出門 還是可以天天買滿買好回家(? 因此為了記錄手機消費跟各種紅利優惠 鴨鴨都會特別注意銀行的App好不好用! 像是介面設計就是會很在意的地方 很多銀行通常會為了要滿足不同客群 會推出很多App讓使用者下載 每次
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
魔鬼藏在二分搜尋裡!輸出值代表的意含、題意產生的邊界條件,寫完模板才是挑戰的開始 Orz