统计区间中的整数数目
难度:
标签:
题目描述
代码结果
运行时间: 416 ms, 内存: 57.6 MB
/*
题目思路:
1. 使用集合存储所有区间并保证无重叠。
2. 新增区间时,利用流来过滤和合并重叠的区间。
3. 计算整数个数时,通过流计算所有区间的总长度。
*/
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class CountIntervalsStream {
private List<int[]> intervals;
public CountIntervalsStream() {
intervals = new ArrayList<>();
}
public void add(int left, int right) {
List<int[]> mergedIntervals = intervals.stream()
.filter(interval -> interval[1] < left || interval[0] > right)
.collect(Collectors.toList());
int[] newInterval = {left, right};
for (int[] interval : intervals) {
if (interval[1] >= left && interval[0] <= right) {
newInterval[0] = Math.min(newInterval[0], interval[0]);
newInterval[1] = Math.max(newInterval[1], interval[1]);
}
}
mergedIntervals.add(newInterval);
intervals = mergedIntervals;
}
public int count() {
return intervals.stream().mapToInt(interval -> interval[1] - interval[0] + 1).sum();
}
}
解释
方法:
题解采用了双向链表来维护区间集合,每个节点代表一个区间。每次添加新区间时,会尝试与现有区间合并以避免重叠,并维护一个计数器cnt来统计所有涵盖的整数数量。具体操作包括:1. 如果新区间在所有现有区间的右边,则直接添加,并更新计数器。2. 如果新区间和现有区间有重叠,则进行合并,并适当地更新计数器以反映合并后的区间的变化。3. 使用双向链表可以方便地插入和删除节点,同时更新前后节点的链接。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
如何处理新添加的区间完全嵌套在现有区间中的情况,例如添加[4,5]到已有的[1,10]区间?
▷🦆
在更新现有区间时,如果新增区间导致多个现有区间合并,`update`函数如何确保所有相关区间都被正确处理并合并?
▷🦆
在`add`方法中,如果`left`值比`self.tail.prev.right`大,直接插入新区间,但是如果left值恰好是`self.tail.prev.right+1`,是否应该合并区间而不是新增?
▷🦆
当通过`update`方法合并区间时,为什么要从当前节点开始向后遍历,而不是从头开始或者使用其他优化策略?
▷