描述
給出一些區間,問覆蓋次數最多的數是多少,如果有多個,輸出最小的那個數。
區間的個數不大於10^5。
區間的左右端點大於0小於等於10^5。
樣例
給出 intervals = [(1,7),(2,8)], 返回 2。
解釋:
2被覆蓋了2次,且是覆蓋2次中最小的數。
給出 intervals = [(1,3),(2,3),(3,4)], 返回 3。
解釋:
3被覆蓋了3次。
思路
構建map存放元素及其當前的集合個數,對於每個interval,在interval.start時,集合數加一,在interval.end+1時,集合數減一。並把每個start和end+1存放在set中,遍歷set求得覆蓋次數最多的數子。
#ifndef C1397_H
#define C1397_H
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
class Interval{
public:
int start, end;
Interval(int start, int end){
this->start = start;
this->end = end;
}
};
class Solution {
public:
/**
* @param intervals: The intervals
* @return: The answer
*/
int digitalCoverage(vector<Interval> &intervals) {
// Write your code here
if (intervals.empty())
return 0;
map<int, int> m;//存放元素和當前集合的個數
set<int> nums;
int num = 0;
int temp = 0;
int cnt = 0;
for (auto c : intervals)
{
++m[c.start];
--m[c.end + 1];//由於end被覆蓋,end+1沒有被覆蓋,要處理的值是end+1
nums.insert(c.start);
nums.insert(c.end + 1);
}
//找到最大覆蓋次數對應的元素
for (auto c : nums)
{
temp += m[c];
if (temp < 0)
temp = 0;
if (temp>cnt)
{
cnt = temp;
num = c;
}
}
return num;
}
};
#endif