LeetCode-911 在线选举

简介: LeetCode-911 在线选举

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/online-election

题目描述

 

给你两个整数数组 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 <= persons.length <= 5000
times.length == persons.length
0 <= persons[i] < persons.length
0 <= times[i] <= 109
times 是一个严格递增的有序数组
times[0] <= t <= 109
每个测试用例最多调用 104 次 q

 

 

解题思路

本题采用预处理+二分法来求解,观察题目提示,times数组和persons数组大小仅为5000,可以作为突破口,将每个时间段的领先候选人记录下来,然后判断查询时候的时间处于哪个时间段内,直接将领先候选人的编号返回。利用计数的方法将所有数据预处理,将领先的候选人存入tops中,tops[i]代表在tims[i]到time[i+1]内领先候选人的编号,查询时候,利用二分库函数upper_bound找到t所在的时间段time[t],直接返回tops[t]。

源码展示

 

class TopVotedCandidate {
public:
    vector<int> mTops;
    vector<int> mTimes;
    TopVotedCandidate(vector<int>& persons, vector<int>& times) {
        mTops.resize(times.size());
        mTimes = times;
        unordered_map<int, int> mapiiCount;
        int iMax = 0, iPerson = -1;
        for(int i = 0; i < persons.size(); i++)
        {
            mapiiCount[persons[i]]++;
            if(iMax <= mapiiCount[persons[i]])
            {
                iMax = mapiiCount[persons[i]];
                iPerson = persons[i];
            }
            mTops[i] = iPerson;
        }
    }
    int q(int t) {
        int iPos = upper_bound(mTimes.begin(), mTimes.end(), t) - mTimes.begin() - 1;
        return mTops[iPos];
    }
};
/**
 * Your TopVotedCandidate object will be instantiated and called as such:
 * TopVotedCandidate* obj = new TopVotedCandidate(persons, times);
 * int param_1 = obj->q(t);
*/

 

 

 

运行结果

 

相关文章
|
3月前
Zookeeper的选举机制原理(图文深度讲解)——过半选举
Zookeeper的选举机制原理(图文深度讲解)——过半选举
248 0
|
11月前
|
消息中间件 算法 容灾
7年工作经验面试被问:谈谈你对Kafka副本Leader选举原理的理解?
一位7年工作经验的小伙伴,面试被问到这样一道题,说:”谈谈你对Kafka副本Leader选举原理的理解“。当时,他想,这Kafka用的不就是Zookeeper 的选举吗?难道Kafka又自己搞了一套。没错,这回Kafka自己造了一个轮子。 那么今天,我给大家来聊一聊我对Kafka副本Leader选举原理的理解。
82 1
|
人工智能 Java BI
java数据结构73:牛的选举
现在有N(1<=n<=50000)头牛在选举它们的总统,选举包括两轮:第一轮投票选举出票数最多的k(1<=k<=n)头牛进入第二轮;第二轮对k头牛重新投票,票数最多的牛当选为总统。< p="">
61 0
|
消息中间件 Dubbo Kafka
蚂蚁面试官:Zookeeper 的选举流程是怎样的?我当场懵逼了
面试经常会遇到面试官问 Zookeeper 的选举原理,我心想,问这些有啥用吗?又不要我造火箭! 每次面试也只知道个大概,并没有深究具体的流程,所以在面试的时候总是不能打动面试官,总是特别吃亏,所以这篇就总结一下其中的要点,也希望能帮助大家搞定面试。 有一说一, Zookeeper 这些工作原理、选举流程,也许大多数人在工作中不会用到,但了解多一点也是自己的优势,避免求职面试被面试官打压工资。Zookeeper 也是现在后端主流的分布式协调框架,很多热门框架都有直接或者间接依赖它,比如:Dubbo、Elastic Job、Kafka 等,所以掌握 ZK 选举流程也是非常有必要的。
|
数据中心 流计算
ZooKeeper 避坑实践: Zxid溢出导致选主
ZooKeeper 本身提供当前处理的最大的 Zxid,通过 stat 接口可查看到当前处理的最大的 zxid 的值,通过此值可以计算当前 zxid 距离溢出值还有多少差距。MSE 提供风险管理以及集群选主相关告警,提前预防和及时感知选主风险,避免业务损失。
ZooKeeper 避坑实践: Zxid溢出导致选主
|
Cloud Native Dubbo Java
ZooKeeper 避坑实践: Zxid溢出导致集群重新选主
微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。
ZooKeeper 避坑实践: Zxid溢出导致集群重新选主
|
存储 监控 开发者
第七节:X-Paxos 三副本与高可用(三)|学习笔记
快速学习第七节:X-Paxos 三副本与高可用(三)
107 0
第七节:X-Paxos 三副本与高可用(三)|学习笔记
|
存储 容灾 关系型数据库
第七节:X-Paxos 三副本与高可用(二)|学习笔记
快速学习第七节:X-Paxos 三副本与高可用(二)
89 0
第七节:X-Paxos 三副本与高可用(二)|学习笔记
|
存储 缓存 运维
第七节:X-Paxos 三副本与高可用(一)|学习笔记
快速学习第七节:X-Paxos 三副本与高可用(一)
281 0
第七节:X-Paxos 三副本与高可用(一)|学习笔记
|
存储 缓存 AliSQL
第七节:X-Paxos 三副本与高可用(四)|学习笔记
快速学习第七节:X-Paxos 三副本与高可用(四)
103 0
第七节:X-Paxos 三副本与高可用(四)|学习笔记