删除区间
难度:
标签:
题目描述
代码结果
运行时间: 36 ms, 内存: 20.2 MB
/*
* 题目:删除区间
* 题目思路:
* 1. 接收两个列表,第一个是给定的区间列表,第二个是需要删除的区间列表。
* 2. 对给定的区间列表和删除区间列表分别排序。
* 3. 对于每一个给定的区间,检查是否与删除区间有重叠部分,如果有,
* 则移除重叠部分并将剩余部分加入结果。
* 4. 返回处理后的区间列表。
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class SolutionStream {
public List<int[]> removeIntervals(int[][] intervals, int[][] toBeRemoved) {
List<int[]> result = new ArrayList<>();
Arrays.stream(intervals).forEach(interval -> {
int start = interval[0];
int end = interval[1];
for (int[] remove : toBeRemoved) {
if (remove[1] <= start || remove[0] >= end) {
continue;
}
if (remove[0] > start) {
result.add(new int[]{start, remove[0]});
}
if (remove[1] < end) {
start = remove[1];
} else {
start = end;
break;
}
}
if (start < end) {
result.add(new int[]{start, end});
}
});
return result;
}
}
解释
方法:
该题解方法遍历给定的所有区间,针对每个区间根据与toBeRemoved区间的相对位置做不同处理。如果当前区间完全在toBeRemoved区间之前或之后,则当前区间不受影响,直接添加到结果列表。如果当前区间被toBeRemoved区间部分或完全覆盖,则根据覆盖情况划分出不受影响的部分,加入到结果列表。具体处理方式包括:完全不重叠、部分重叠和完全覆盖。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
题解中提到的处理方式包括完全不重叠、部分重叠和完全覆盖,能否详细解释这三种情况是如何判断的?
▷🦆
在处理部分重叠的情况时,为什么选择将不重叠的部分分割出来,而不是直接修改原区间的值?
▷🦆
对于每个区间的处理,题解中提到了多种情况,是否有可能存在题解未涉及到的其他情况?
▷🦆
在题解中,如果一个区间被toBeRemoved区间完全覆盖,题解选择分割成两个新区间添加到结果列表,这种情况是否处理得当?是否有可能导致错误的输出?
▷