leetcode
leetcode 1051 ~ 1100
删除区间

删除区间

难度:

标签:

题目描述

代码结果

运行时间: 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)

代码细节讲解

🦆
题解中提到的处理方式包括完全不重叠、部分重叠和完全覆盖,能否详细解释这三种情况是如何判断的?
在题解中,三种情况是这样判断的:1. 完全不重叠,即当前区间的结束点小于或等于toBeRemoved区间的起始点,或当前区间的起始点大于或等于toBeRemoved区间的结束点。这种情况下,当前区间与toBeRemoved无任何交集。2. 部分重叠,是指当前区间的一部分与toBeRemoved区间重叠,但不是完全覆盖。这种情况具体表现为当前区间的起始点在toBeRemoved起始点之前,但结束点在toBeRemoved区间内;或当前区间的起始点在toBeRemoved区间内,但结束点在toBeRemoved结束点之后。3. 完全覆盖,是指toBeRemoved区间的起始点和结束点都处于当前区间内部,从而toBeRemoved完全覆盖了当前区间的一部分。通过比较区间的起始和结束点可以判断这些情况。
🦆
在处理部分重叠的情况时,为什么选择将不重叠的部分分割出来,而不是直接修改原区间的值?
选择将不重叠的部分分割出来而不是修改原区间的值是因为:1. 保持数据不可变性,避免原始数据结构的修改可能带来的错误和复杂性。2. 分割出来的新区间可以直接添加到结果列表中,这样处理更为直接和清晰。3. 修改原区间的值可能会影响到后续的判断和处理逻辑,尤其是在循环中处理多个区间时。因此,从设计和实现的角度考虑,分割出不重叠的部分更为合理且安全。
🦆
对于每个区间的处理,题解中提到了多种情况,是否有可能存在题解未涉及到的其他情况?
题解已经涵盖了所有可能的重叠情况,包括完全不重叠、部分重叠的几种情况(左侧或右侧重叠,起点或终点相同),以及完全覆盖的情况。这些基本涵盖了所有与toBeRemoved区间可能的相对位置关系。因此,按照当前的描述和逻辑,不存在题解未涉及到的其他情况。
🦆
在题解中,如果一个区间被toBeRemoved区间完全覆盖,题解选择分割成两个新区间添加到结果列表,这种情况是否处理得当?是否有可能导致错误的输出?
题解中描述的情况有误,如果一个区间被toBeRemoved区间完全覆盖,实际上应该没有部分被添加到结果列表中。正确的处理应该是:如果toBeRemoved区间完全覆盖了当前区间的一部分(即toBeRemoved区间的起始点和结束点都在当前区间内部),则应分割出不被覆盖的两端。如果toBeRemoved区间完全包括整个当前区间,则不应该添加任何部分到结果列表。因此,如果按照题解原先的描述处理,确实可能导致错误的输出,即错误地将完全被覆盖的区间分割成两个新区间。

相关问题