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

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解题报告Leecode911. 在线选举——Leecode每日一题系列相关的知识,希望对你有一定的参考价值。

题目链接:https://leetcode-cn.com/problems/online-election/

题解汇总:https://zhanglong.blog.csdn.net/article/details/121071779


题目描述

给你两个整数数组 persons 和 times 。在选举中,第 i 张票是在时刻为 times[i] 时投给候选人 persons[i] 的。

对于发生在时刻 t 的每个查询,需要找出在 t 时刻在选举中领先的候选人的编号。

在 t 时刻投出的选票也将被计入我们的查询之中。在平局的情况下,最近获得投票的候选人将会获胜。

实现 TopVotedCandidate 类:

TopVotedCandidate(int[] persons, int[] times) 使用 persons 和 times 数组初始化对象。
int q(int t) 根据前面描述的规则,返回在时刻 t 在选举中领先的候选人的编号。

示例:
输入:
[“TopVotedCandidate”, “q”, “q”, “q”, “q”, “q”, “q”]
[[[0, 1, 1, 0, 0, 1, 0], [0, 5, 10, 15, 20, 25, 30]], [3], [12], [25], [15], [24], [8]]

输出:
[null, 0, 1, 1, 0, 0, 1]

解释:
TopVotedCandidate topVotedCandidate = new TopVotedCandidate([0, 1, 1, 0, 0, 1, 0], [0, 5, 10, 15, 20, 25, 30]);
topVotedCandidate.q(3); // 返回 0 ,在时刻 3 ,票数分布为 [0] ,编号为 0 的候选人领先。
topVotedCandidate.q(12); // 返回 1 ,在时刻 12 ,票数分布为 [0,1,1] ,编号为 1 的候选人领先。
topVotedCandidate.q(25); // 返回 1 ,在时刻 25 ,票数分布为 [0,1,1,0,0,1] ,编号为 1 的候选人领先。(在平局的情况下,1 是最近获得投票的候选人)。
topVotedCandidate.q(15); // 返回 0
topVotedCandidate.q(24); // 返回 0
topVotedCandidate.q(8); // 返回 1


题解:

票选是在离散时间上发生的,每次更新只会对票数+1。 基于此,我们只需按照时间顺序遍历,找出每个时间点票数最高的人。

但由于时间是不连续的,最后给出任意一个时间点查询时,我们还需要进行一次二分搜索。
找到到当前时间点最近的一次投票时间点,那个时候对应的最领先的候选人就是答案。

我将这套方法称之为节点预处理。即不需要将每个值都预处理,只处理关键节点即可。


class TopVotedCandidate 
private:
    vector<int> times;
    unordered_map<int, int>vis, res;
    int n;

public:
    TopVotedCandidate(vector<int>& persons, vector<int>& times) 
        this->times = times;
        n = persons.size();
        int max_val = 0;               // 保存当前最大的值

        for (int i = 0; i < n; ++i) 
            vis[persons[i]]++;
            if (vis[persons[i]] >= max_val) 
                max_val = vis[persons[i]];
                res[times[i]] = persons[i];
             else 
                res[times[i]] = res[times[i-1]];
            
        

    

    int q(int t) 
        int l = 0, r = n-1, m;
        while (l < r) 
            m = (l + r) / 2;
            if (times[m] == t) return res[times[m]];
            else if (t > times[m]) l = m+1;
            else r = m-1;
        
        if (times[l] > t) return res[times[l-1]];
        else return res[times[l]];
    
;

以上是关于解题报告Leecode911. 在线选举——Leecode每日一题系列的主要内容,如果未能解决你的问题,请参考以下文章

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

[LeetCode] 911. Online Election 在线选举

Leetcode-911 Online Election(在线选举)

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

解题报告Leecode 35. 搜索插入位置——Leecode刷题系列

解题报告Leecode 35. 搜索插入位置——Leecode刷题系列