打点计数器区间合并 | 豆包MarsCode AI刷题

115 阅读3分钟

伴学笔记:打点计数器的区间合并问题

问题描述 小明正在设计一台打点计数器,该计数器可以接受多个递增的数字范围,并对这些范围内的每个唯一数字打点。如果多个范围之间有重叠,计数器将合并这些范围并只对每个唯一数字打一次点。小明需要你帮助他计算,在给定的多组数字范围内,计数器会打多少个点。

例如,给定三个数字范围 [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

一、问题理解

小明设计的打点计数器问题,实质上是一个区间合并与去重的问题。计数器需要接受多个递增的数字范围,并对这些范围内的每个唯一数字进行打点。如果多个范围之间存在重叠,计数器需要合并这些范围,并确保每个数字只被打点一次。我们的目标是计算出在给定的多组数字范围内,计数器会打多少个唯一的点。

二、解题思路

  1. 数据结构设计

    • 我们需要一种数据结构来存储唯一的数字。在Java中,Set是一个很好的选择,因为它不允许存储重复的元素,并且内部自动维护了元素的唯一性和有序性(虽然HashSet不保证顺序,但对我们的问题来说,顺序不是关键)。
  2. 遍历区间

    • 对于输入的每个区间,我们需要遍历其中的每个数字,并将它们添加到Set中。由于Set的自动去重特性,任何重复的数字都只会被存储一次。
  3. 计算结果

    • 遍历完所有区间后,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();

}