伴学笔记:打点计数器的区间合并问题
问题描述 小明正在设计一台打点计数器,该计数器可以接受多个递增的数字范围,并对这些范围内的每个唯一数字打点。如果多个范围之间有重叠,计数器将合并这些范围并只对每个唯一数字打一次点。小明需要你帮助他计算,在给定的多组数字范围内,计数器会打多少个点。
例如,给定三个数字范围 [1, 4], [7, 10], 和 [3, 5],计数器首先将这些范围合并,变成 [1, 5] 和 [7, 10],然后计算这两个范围内共有多少个唯一数字,即从 1 到 5 有 5 个数字,从 7 到 10 有 4 个数字,共打 9 个点。
测试样例 样例1:
输入:inputArray = [[1, 4], [7, 10], [3, 5]] 输出:9
样例2:
输入:inputArray = [[1, 2], [6, 10], [11, 15]] 输出:12
样例3:
输入:inputArray = [[1, 3], [2, 6], [8, 10]] 输出:9
一、问题理解
小明设计的打点计数器问题,实质上是一个区间合并与去重的问题。计数器需要接受多个递增的数字范围,并对这些范围内的每个唯一数字进行打点。如果多个范围之间存在重叠,计数器需要合并这些范围,并确保每个数字只被打点一次。我们的目标是计算出在给定的多组数字范围内,计数器会打多少个唯一的点。
二、解题思路
-
数据结构设计:
- 我们需要一种数据结构来存储唯一的数字。在Java中,
Set是一个很好的选择,因为它不允许存储重复的元素,并且内部自动维护了元素的唯一性和有序性(虽然HashSet不保证顺序,但对我们的问题来说,顺序不是关键)。
- 我们需要一种数据结构来存储唯一的数字。在Java中,
-
遍历区间:
- 对于输入的每个区间,我们需要遍历其中的每个数字,并将它们添加到
Set中。由于Set的自动去重特性,任何重复的数字都只会被存储一次。
- 对于输入的每个区间,我们需要遍历其中的每个数字,并将它们添加到
-
计算结果:
- 遍历完所有区间后,
Set中存储的就是所有唯一的数字。我们只需要返回Set的大小,即可得到打点计数器的打点总数。
- 遍历完所有区间后,
三、代码实现
代码实现部分相对简单,按照上述思路进行即可。首先,创建一个HashSet来存储唯一的数字。然后,遍历输入的每个区间,将区间内的每个数字添加到HashSet中。最后,返回HashSet的大小作为结果。
四、代码优化
虽然上述代码可以正确解决问题,但在某些情况下,它可能不是最优解。例如,当输入的区间非常多且存在大量重叠时,逐个遍历区间并添加数字到Set中可能会比较耗时。一种优化方法是先对区间进行排序,然后利用贪心算法或线段树等数据结构来合并区间,从而减少需要遍历的数字数量。不过,对于本题来说,由于输入规模较小,上述简单实现已经足够高效。
五、总结
本题主要考察了我们对数据结构的理解和应用,以及如何通过编程解决实际问题。通过这个问题,我们可以学习到如何使用Set来存储唯一元素,以及如何通过遍历区间来合并和去重数字。同时,这个问题也提醒我们,在解决实际问题时,需要根据具体需求选择合适的数据结构和算法。
public static int solution(int[][] inputArray) {
// Please write your code here
Set<Integer>uniqueNum=new HashSet<>();
for (int[] range : inputArray) {
// 遍历每个范围中的数字
for (int num = range[0]; num <= range[1]; num++) {
// 将数字添加到集合中
uniqueNum.add(num);
}
}
// 返回集合的大小
return uniqueNum.size();
}