LeetCode:57. Insert Interval (向一個區間中插入一個區間)
阿新 • • 發佈:2021-01-20
文章最前: 我是Octopus,這個名字來源於我的中文名--章魚;我熱愛程式設計、熱愛演算法、熱愛開源。所有原始碼在我的個人github;這部落格是記錄我學習的點點滴滴,如果您對 Python、Java、AI、演算法有興趣,可以關注我的動態,一起學習,共同進步。
相關文章:
- LeetCode:55. Jump Game(跳遠比賽)
- Leetcode:300. Longest Increasing Subsequence(最大增長序列)
- LeetCode:560. Subarray Sum Equals K(找出陣列中連續子串和等於k)
文章目錄:
題目描述:
給出一個無重疊的 ,按照區間起始端點排序的區間列表。
在列表中插入一個新的區間,你需要確保列表中的區間仍然有序且不重疊(如果有必要的話,可以合併區間)。
示例1:
輸入:intervals = [[1,3],[6,9]], newInterval = [2,5]
輸出:[[1,5],[6,9]]
示例2:
輸入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8] 輸出:[[1,2],[3,10],[12,16]] 解釋:這是因為新的區間 [4,8] 與 [3,5],[6,7],[8,10]重疊。
來源:力扣(LeetCode)
java實現方法1:
/** * 插入新區間合併之後 * * @param intervals 區間 * @param newInterval 新區間 * @return 新區間 */ public int[][] insert2(int[][] intervals, int[] newInterval) { int left = newInterval[0]; int right = newInterval[1]; boolean placed = false; List<int[]> intervalList = new ArrayList(); for (int[] interval : intervals) { if (interval[0] > right) { // 在插入區間的右側且無交集 if (!placed) { intervalList.add(new int[]{left, right}); placed = true; } intervalList.add(interval); } else if (interval[1] < left) { // 在插入區間的左側且無交集 intervalList.add(interval); } else { // 與插入區間有交集,計算它們的並集 left = Math.min(left, interval[0]); right = Math.max(right, interval[1]); } } if (!placed) { intervalList.add(new int[]{left, right}); } int[][] ans = new int[intervalList.size()][]; for (int i = 0; i < intervalList.size(); ++i) { ans[i] = intervalList.get(i); } return ans; }
時間複雜度:O(n)
空間複雜度: O(n)
python實現方法1:
def insert(self, intervals: List[List[int]], new_interval: List[int]) -> List[List[int]]:
'''
一個排序好的區間插入一個區間
Args:
intervals: 聯絡區間
new_interval: 新區間
Returns:
合併後區間
'''
left = new_interval[0]
right = new_interval[1]
place = False
result = []
for interval in intervals:
if interval[0] > right:
if not place:
result.append([left, right])
place = True
result.append(interval)
elif interval[1] < left:
result.append(interval)
else:
left = min(left, interval[0])
right = max(right, interval[1])
if not place:
result.append([left, right])
return result
時間複雜度:O(n)
空間複雜度: O(n)