[LeetCode] 57. 插入区间
题目链接 : https://leetcode-cn.com/problems/insert-interval/
题目描述:
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例:
示例 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] 重叠。
思路:
先考虑三种极端情况
intervals
为空newInterval[1] < intervals[0][0]
,直接插入第一个位置newInterval[0] > intervals[-1][1]
,直接插入最后一个位置
下面就要考虑重叠情况了
我们目标就是找到和newInterval
相关那几个区间.
首先,左边,当newInterval[0] > intervals[i][1]
说明没有和该区间没有重叠部分,继续遍历下一个区间,比如intervals = [[1,3],[6,9]], newInterval = [2,5]
然后,再看右边,这里有个情况,就是 当intervals[i][0] > newInterval[1]
说明newInterval
没有和任何区间重合,比如intervals = [[1,3],[6,9]], newInterval = [4,5]
,直接插入即可.
接下来我们要找右边重合区域,当while i < n and newInterval[1] >= intervals[i][0]
说明有重叠部分,记录左边最大值!
最后把数组拼接一下即可!
上面就是我们思考过程,
接下来我们可以把过程简化,直接看代码,很好理解的
关注我的知乎专栏,了解更多的解题技巧,大家共同进步!
代码:
复杂版:
class Solution:
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
if not intervals: return [newInterval]
if newInterval[1] < intervals[0][0]: return [newInterval] + intervals
if newInterval[0] > intervals[-1][1]: return intervals + [newInterval]
i = 0
n = len(intervals)
while i < n and newInterval[0] > intervals[i][1]:
i += 1
left = min(intervals[i][0], newInterval[0])
tmp = i
if intervals[i][0] > newInterval[1]:
return intervals[:tmp] + [newInterval] + intervals[tmp:]
#print(tmp)
right = newInterval[1]
while i < n and newInterval[1] >= intervals[i][0]:
right = max(right, intervals[i][1])
i += 1
#print(i)
return intervals[:tmp] + [[left, right]] + intervals[i:]
简化版
class Solution:
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
i = 0
n = len(intervals)
res = []
# 找左边重合区域
while i < n and newInterval[0] > intervals[i][1]:
res.append(intervals[i])
i += 1
tmp = [newInterval[0], newInterval[1]]
# 找右边重合区域
while i < n and newInterval[1] >= intervals[i][0]:
tmp[0] = min(tmp[0], intervals[i][0])
tmp[1] = max(tmp[1], intervals[i][1])
i += 1
res.append(tmp)
while i < n :
res.append(intervals[i])
i += 1
return res
java
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
List<int[]> res = new ArrayList<>();
int i = 0;
while (i < intervals.length && newInterval[0] > intervals[i][1]) {
res.add(intervals[i]);
i++;
}
int[] tmp = new int[]{newInterval[0], newInterval[1]};
while (i < intervals.length && newInterval[1] >= intervals[i][0]) {
tmp[0] = Math.min(tmp[0], intervals[i][0]);
tmp[1] = Math.max(tmp[1], intervals[i][1]);
i++;
}
res.add(tmp);
while (i < intervals.length) {
res.add(intervals[i]);
i++;
}
return res.toArray(new int[0][]);
}
}