能否在O(N)时间复杂度内计算区间覆盖的整数总个数?
区间覆盖整数总数的计算方法与时间复杂度分析
嘿,我来帮你把这个问题拆解清楚~
首先直接给结论:没办法在O(N)时间复杂度内完成这个计算。原因很简单——如果区间是完全无序的,你必须先对区间进行排序才能合并重叠/相邻的区间,而基于比较的排序算法时间复杂度下界就是O(N log N),这一步绕不开,所以整体最优时间复杂度是O(N log N),而非O(N)。
接下来具体讲解法的排序方式和遍历逻辑:
1. 排序规则
把所有区间按照左端点x从小到大排序;如果两个区间左端点相同,就按右端点y从大到小排序(这样能让覆盖范围更大的区间排在前面,减少后续重复判断)。
2. 线性遍历计算逻辑
排序完成后,我们只需要一次线性遍历就能统计出覆盖的整数总数,步骤如下:
- 初始化:取排序后的第一个区间
[start, end],设置current_end = end,初始覆盖数count = end - start + 1(闭区间的整数个数公式,比如[1,5]就是5-1+1=5个)。 - 从第二个区间开始逐个遍历:
- 情况1:当前区间的左端点
x > current_end + 1——说明这个区间和之前的覆盖范围完全不重叠也不相邻,直接把这个区间的整数个数y - x + 1加到count里,同时更新current_end为y。 - 情况2:当前区间的左端点
x <= current_end + 1——说明两个区间有重叠或相邻,此时新的覆盖右端点是max(current_end, y),新增的覆盖数是max(current_end, y) - current_end,把这个数加到count里,再更新current_end为这个最大值。
- 情况1:当前区间的左端点
3. 示例验证
拿你给出的例子来看:N=3,区间[1,5]、[3,7]、[5,7]
- 排序后顺序不变(左端点递增)
- 初始
current_end=5,count=5-1+1=5 - 遍历第二个区间
[3,7]:3 <=5+1,max(5,7)=7,新增7-5=2,count=5+2=7,current_end=7 - 遍历第三个区间
[5,7]:5 <=7+1,max(7,7)=7,新增0,count保持7
最终结果就是7,和示例一致。
补充说明
为什么必须排序?举个极端例子:如果给你的区间是[100,200]、[1,2]、[3,4]...[99,100],不排序的话你根本没法知道这些区间其实是连续覆盖1到200的,必须通过排序把它们按顺序排列,才能正确合并计算。
内容的提问来源于stack exchange,提问作者someone12321
相关产品推荐
相关产品推荐

