【Leetcode解題】57. Insert Interval
題目
- 題目連結
- 目標函式 :
insert(intervals, newInterval)- Input :
intervals: List[List[int]]、newInterval: List[int] - Output :
List[List[int]]
- Input :
解題概念
- 題意 : 給定一個不重疊的區間
intervals,其中 :intervals[i] = [start_i, end_i]表示第i個區間的開始與結束- 區間將會按照
start_i升序排列
- 另外也會給定一個區間
newInterval = [start, end],表示該區間的開始和結束。 - 將
newInterval插入intervals中,使得intervals仍然按start_i升序排序,且intervals仍然沒有任何重疊區間(如有必要,合併重疊區間)。 - 需要回傳插入後的
intervals
我的寫法
想法 : 使用 for 迴圈,去判斷
intervals[i]與 `newInterval 的關係
遇到之困難 :
- 需要判斷這6項狀況以外,還要去判斷每回合的
start[i]與end[i]的去留,這樣在判斷下去會過於複雜…
- 需要判斷這6項狀況以外,還要去判斷每回合的
解答 or 其他優秀寫法
- 想法 : 其實根本不用思考那6個狀況:O
- Stage 1 : 若
intervals[i]end 比newIntervalstart 還小的話,則一直將intervals[i]加到res中 - Stage 2 : 若
intervals[i]start 比newIntervalend 還大 or 相等的話,則合併intervals[i]與newInterval(透過min()與max()去決定哪個數字要去當新的 start 或 end),最後在將該值設為新的newInterval - Stage 3 : 此時
intervals[i]已超出newInterval的範圍,故將newInterval加到res中 - Stage 4 : 最後將剩下的
intervals[i]加到res中
- Stage 1 : 若
- 程式碼 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28def insert(self, intervals, newInterval):
res = []
i = 0
# Stage 1
while i < len(intervals) and intervals[i][1] < newInterval[0]:
res.append(intervals[i])
i += 1
# Stage 2
while i < len(intervals) and intervals[i][0] <= newInterval[1]:
new_start = min(newInterval[0], intervals[i][0])
new_end = max(newInterval[1], intervals[i][1])
newInterval = [new_start, new_end]
i += 1
# Stage 3
res.append(newInterval)
# Stage 4
while i < len(intervals):
res.append(intervals[i])
i += 1
return res - 成效 :
- Time Complexity : $O(n)$
- Runtime: 48 ms (faster than 89.49%)
- Memory Usage: 16.62 MB (more than 72.84%)
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Robin's Tech Blog!


