解题报告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. 转换成小写字母