解题思路:
既然已经给出了时间段的投票结果,那么我们就可以提前计算好到达某个时间段时,领先的人是谁,用一个哈希表存储编号-票数对,用一个变量top来记录当前最多票数的编号,用tops存储每个时间段领先人编号,这是一个数组,在q函数中直接二分法在tops中寻找即可,这里我想多讲讲这个二分法。因为这里的二分法和平常情况不同,t可能在时间数组中可能在某个时间段之间,所以直接模板不大行,需要略改一下,首先要明确,最后返回的是t时间之前所在的时间段的领先人,所以应该是right-1向下走,最后返回的是right,初始化mid的时候由于会出现0,1这样的mid永远是0的情况,这样right就跨不过去了,所以要让mid向上取整,这样mid才能跨过去,代码如下:
class TopVotedCandidate {
private:
vector<int> times;
vector<int> tops;
public:
TopVotedCandidate(vector<int>& persons, vector<int>& times) {
unordered_map<int, int> mp;
mp[-1] = -1;
int top = -1;
for(auto& person : persons) {
mp[person] ++;
if(mp[person] >= mp[top]) {
top = person;
}
tops.push_back(top);
}
this->times = times;
}
int q(int t) {
int left = 0, right = times.size() - 1;
while(left < right) {
int mid = (left + right + 1) / 2;
if(times[mid] <= t) {
left = mid;
} else {
right = mid - 1;
}
}
return tops[right];
}
};
/**
* Your TopVotedCandidate object will be instantiated and called as such:
* TopVotedCandidate* obj = new TopVotedCandidate(persons, times);
* int param_1 = obj->q(t);
*/