覆蓋數字 - LintCode

描述
給出一些區間,問覆蓋次數最多的數是多少,如果有多個,輸出最小的那個數。

區間的個數不大於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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章