LeetCode 911 在线选举[Map 二分法] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 911 在线选举[Map 二分法] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。


解题思路:
既然已经给出了时间段的投票结果,那么我们就可以提前计算好到达某个时间段时,领先的人是谁,用一个哈希表存储编号-票数对,用一个变量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);
 */

以上是关于LeetCode 911 在线选举[Map 二分法] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 911. Online Election 在线选举

LeetCode 748. 最短补全词 / 911. 在线选举 / 709. 转换成小写字母

解题报告Leecode911. 在线选举——Leecode每日一题系列

解题报告Leecode911. 在线选举——Leecode每日一题系列

《LeetCode之每日一题》:232.在线选举

LeetCode_Dec_1st_Week