面试经典150题——插入区间
"The future belongs to those who believe in the beauty of their dreams." - Eleanor Roosevelt
1. 题目描述
2. 题目分析与解析
2.1 思路一
解决这个问题的思路是基于区间排序和合并的经典算法。这个问题的关键在于如何处理新区间与现有区间的关系,尤其是重叠部分。
-
区间排序:
-
因为题目中提到了区间列表
intervals
已经根据每个区间的起始位置进行排序。这是解题的前提,因为如果区间没有排序,我们无法直接进行合并操作,因为合并需要比较相邻区间的位置。
-
-
检查无重叠区间:
-
当前区间在新区间之前结束:如果
intervals[i][1] < newInterval[0]
,那么当前区间与新区间无重叠,并且因为区间列表是有序的,当前区间是所有可能与新区间无重叠并且在其之前的最后一个区间。所以可以直接将当前区间添加到结果列表中。 -
当前区间在新区间之后开始:如果
intervals[i][0] > newInterval[1]
,那么当前区间与新区间无重叠,并且是第一个完全在新区间之后开始的区间。在这种情况下,我们应该将新区间添加到结果列表中,因为我们知道新区间不会与任何后续的区间重叠。
-
我们首先检查新区间
newInterval
是否与当前遍历到的区间完全不重叠。这有两种情况:如果完全不重叠,那么对于以上的情况我们就直接可以加入结果集。
-
-
合并重叠区间:
-
起始位置:取当前区间的起始位置和新区间起始位置之间的较小值作为合并后的新区间起始位置。
-
结束位置:取当前区间的结束位置和新区间结束位置之间的较大值作为合并后的新区间结束位置。
-
当前区间如果与新区间有重叠,我们需要合并它们。合并的方式是更新新区间的起始和结束位置:
-
-
处理所有区间:
-
继续上述过程直到所有区间都被处理。这意味着要么所有的区间都添加到结果列表中,要么被合并到新区间中。
-
-
添加剩余的新区间:
-
遍历结束后,如果新区间还没有被添加到结果列表中,那么意味着新区间应该被添加到所有区间的末尾。
-
-
返回结果:
-
最后,将存储结果的列表转换为数组形式并返回。
-
整个解题思路的核心是逐步构建最终的区间列表,这通过判断新区间与当前区间之间的位置关系来实现。如果区间不重叠,它们就可以被独立添加到结果列表中;如果它们重叠,就需要合并。所以根据以上内容,我们可以写出如下代码思路:
-
创建一个新的列表(或数组),用于存放最终的区间列表。
-
遍历原始区间列表,对于每个区间:
-
如果当前区间的结束小于新区间的开始,说明没有重叠,将当前区间添加到新列表中。
-
如果当前区间的开始大于新区间的结束,说明后面的区间也不会重叠,将新区间添加到新列表中,并将剩下的原始区间全部添加到新列表中,然后跳出循环。
-
如果以上两种情况都不满足,说明有重叠,此时应该合并区间。将新区间的开始更新为当前区间的开始和新区间开始中的较小者,新区间的结束更新为当前区间的结束和新区间结束中的较大者。
-
-
如果遍历完所有原始区间后,新区间还未被添加到列表中,则将其添加到列表的末尾。
3. 代码实现
3.1 思路一
4. 相关复杂度分析
时间复杂度分析:
-
遍历区间列表的时间复杂度为O(n),其中n是区间列表的长度。
-
在遍历过程中,对于每个区间,都需要进行一些判断和更新操作,这些操作的时间复杂度都是O(1)。
-
因此,整体时间复杂度为O(n)。
空间复杂度分析:
-
创建了一个新的ArrayList用于存放最终的区间列表,所以空间复杂度为O(n)。
-
遍历过程中没有使用额外的空间,只是对原有的区间列表和新区间进行操作,所以额外的空间复杂度为O(1)。
-
因此,整体空间复杂度为O(n)。
-
除了存储返回答案的空间以外,我们只需要额外的常数空间即可。因此开始为O(1)
综上所述,该方法的时间复杂度为O(n),空间复杂度也为O(1)。
原文地址:https://blog.csdn.net/m0_60388871/article/details/136371446
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!