大点计数器的区间合并

121 阅读2分钟

问题描述

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

例如,给定三个数字范围 [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, 4] 和 [3, 5],合并后应该是 [1, 5],总点数为 5。

数据结构选择

  1. Set

    • 使用 Set 来存储所有不重复的点。Set 的特性是自动去重,非常适合用来存储不重复的点。

算法步骤

  1. 初始化 Set

    • 创建一个 Set 来存储所有不重复的点。
  2. 遍历每个区间

    • 对于每个区间 [start, end],将 start 到 end 之间的所有点加入到 Set 中。
  3. 计算 Set 的大小

    • Set 的大小就是计数器打出的点数。

具体步骤

  1. 初始化 Set

    • 创建一个 HashSet 来存储所有不重复的点。
  2. 遍历区间并添加点

    • 对于每个区间 [start, end],使用一个循环将 start 到 end 之间的所有点加入到 Set 中。
  3. 返回 Set 的大小

    • Set 的大小就是计数器打出的点数。

代码

import java.util.HashSet; import java.util.Set;

public class Main { public static int solution(int[][] inputArray) { // 初始化一个Set来存储所有不重复的点 Set points = new HashSet<>();

    // 遍历每个区间
    for (int[] range : inputArray) {
        int start = range[0];
        int end = range[1];
        
        // 将区间内的所有点加入到Set中
        for (int i = start; i <= end; i++) {
            points.add(i);
        }
    }
    
    // Set的大小就是计数器打出的点数
    return points.size();
}

public static void main(String[] args) {
    int[][] testArray1 = {{1, 4}, {7, 10}, {3, 5}};
    int[][] testArray2 = {{1, 2}, {6, 10}, {11, 15}};

    System.out.println(solution(testArray1) == 7); // 应该输出true
    System.out.println(solution(testArray2) == 9); // 应该输出true
}

}

总结

通过使用 Set 来存储所有不重复的点,我们可以轻松地处理区间合并和去重的问题。遍历每个区间并将区间内的点加入到 Set 中,最后 Set 的大小就是我们需要的结果。