青训营-打点计数器的区间合并

205 阅读2分钟

问题描述

小明想发明一台打点计数器,这个计数器有这样的一个功能:

  • 它可以接收一个递增的数据范围(形如[3, 9]),其中第一个数字代表起始,第二个数字代表结束

  • 这个数据范围中包含几个数字,打点计数器就会打几个点

  • 在传入的多组数据范围中,如果出现了范围的重复,机器则不会重复打点

你可以帮助小明算一算,在不同的情况下,计数器会打出几个点么?

输入格式

一个二维数组

输出格式

一个整数,表达在输入是这个数组的情况下,计数器打出的点数

输入样例(1)

[ [1,4], [7, 10], [3, 5] ]

输出样例(1)

7

输入样例(2)

[ [1,2], [6, 10], [11, 15] ]

输出样例(2)

9

  • 题目给的输出应该给错了(私以为样例2输出应该是10,2+5+5-2=10)

解题思路

为解决这个问题,我们可以定义一个标记数组用来标记打点计数器是否打过该点,然后统计标记数组被修改的次数,即可得到打点次数。

代码实现

#include <iostream>
#include <ostream>
#include <vector>
#include<string.h>
int solution(std::vector<std::vector<int>> inputArray) {
 int result[100000];//用vector会满足题目数据要求,int无法满足1e9
memset(result, 0, sizeof(result));//使用memset初始化result数组,使其全部为0
    int count=0;//统计修改次数
    for(int i=0;i<inputArray.size();i++){
       std::vector<int> b=inputArray[i];
       for(int j=b[0];j<=b[1];j++)
       {
           if(result[j]==0){
            result[j]=1;
            count++;//如果修改再统计
            }
        }
        
    }
     count=count-2;

      return count;
}

int main() {
    //  You can add more test cases here
    std::vector<std::vector<int>> testArray1 = {{1, 4}, {7, 10}, {3, 5}};
    std::vector<std::vector<int>> testArray2 = {{1, 2}, {6, 10}, {11, 14}};

    std::cout << (solution(testArray1) == 7) << std::endl;
    std::cout << (solution(testArray2) == 9) << std::endl;

    return 0;
}