[LeetCode] 1272. Remove Interval
A set of real numbers can be represented as the union of several disjoint intervals, where each interval is in the form [a, b)
. A real number x
is in the set if one of its intervals [a, b)
contains x
(i.e. a <= x < b
).
You are given a sorted list of disjoint intervals intervals
representing a set of real numbers as described above, where intervals[i] = [ai, bi]
represents the interval [ai, bi)
. You are also given another interval toBeRemoved
.
Return the set of real numbers with the interval toBeRemoved
removed from intervals
. In other words, return the set of real numbers such that every x
in the set is in intervals
but not in toBeRemoved
. Your answer should be a sorted list of disjoint intervals as described above.
Example 1:
Input: intervals = [[0,2],[3,4],[5,7]], toBeRemoved = [1,6] Output: [[0,1],[6,7]]
Example 2:
Input: intervals = [[0,5]], toBeRemoved = [2,3] Output: [[0,2],[3,5]]
Example 3:
Input: intervals = [[-5,-4],[-3,-2],[1,2],[3,5],[8,9]], toBeRemoved = [-1,4] Output: [[-5,-4],[-3,-2],[4,5],[8,9]]
Constraints:
1 <= intervals.length <= 104
-109 <= ai < bi <= 109
删除区间。
实数集合可以表示为若干不相交区间的并集,其中每个区间的形式为 [a, b)(左闭右开),表示满足 a <= x < b 的所有实数 x 的集合。如果某个区间 [a, b) 中包含实数 x ,则称实数 x 在集合中。
给你一个 有序的 不相交区间列表 intervals 。intervals 表示一个实数集合,其中每一项 intervals[i] = [ai, bi] 都表示一个区间 [ai, bi) 。再给你一个要删除的区间 toBeRemoved 。
返回 一组实数,该实数表示intervals 中 删除 了 toBeRemoved 的部分 。换句话说,返回实数集合,并满足集合中的每个实数 x 都在 intervals 中,但不在 toBeRemoved 中。你的答案应该是一个如上所述的 有序的 不相连的间隔列表 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-interval
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这也是属于扫描线一类的题目。思路也比较直接,遍历 input 数组,跟需要去掉的区间 toBeRemoved 没有重叠的子区间就直接加入结果集。如果跟 toBeRemoved 有重叠的部分,则比较两者的左边界和右边界来得出需要去掉的区间是什么。
时间O(n)
空间O(n) - output list
Java实现
1 class Solution { 2 public List<List<Integer>> removeInterval(int[][] intervals, int[] toBeRemoved) { 3 List<List<Integer>> res = new ArrayList<>(); 4 for (int[] i : intervals) { 5 // no overlap 6 if (i[1] <= toBeRemoved[0] || i[0] >= toBeRemoved[1]) { 7 res.add(Arrays.asList(i[0], i[1])); 8 } 9 // i[1] > toBeRemoved[0] && i[0] < toBeRemoved[1] 10 else { 11 // left end no overlap 12 if (i[0] < toBeRemoved[0]) { 13 res.add(Arrays.asList(i[0], toBeRemoved[0])); 14 } 15 // right end no overlap 16 if (i[1] > toBeRemoved[1]) { 17 res.add(Arrays.asList(toBeRemoved[1], i[1])); 18 } 19 } 20 } 21 return res; 22 } 23 }