leetcode 911. 在线选举 详细解释

该博客讨论了一个在线选举的问题,其中需要在特定时间点找出获得最多票的候选人。解决方案是通过二分查找配合维护一个票数记录的数组来高效地回答查询。题目提供了示例输入和输出,解释了如何初始化TopVotedCandidate类并使用其q方法来查询在特定时刻领先的候选人。代码示例中,使用HashMap存储每个候选人的票数,并通过更新maxPerson数组来跟踪在每个时间点领先的候选人。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

给你两个整数数组 persons 和 times 。在选举中,第 i 张票是在时刻为 >times[i] 时投给候选人 persons[i] 的。
对于发生在时刻 t 的每个查询,需要找出在 t 时刻在选举中领先的候选人的编号。
在 t 时刻投出的选票也将被计入我们的查询之中。在平局的情况下,最近获得投票的候选人将会获胜。

实现 TopVotedCandidate 类:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/online-election
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目分析

上面的都是leetcode 的描述没什么好说的 下面的示例就有点意思了

示例:

输入:
["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

// 初始代码
class TopVotedCandidate {

    public TopVotedCandidate(int[] persons, int[] times) {
      
    }

    public int q(int t) {
       
    }
}

看他的示例解释 和 给的代码模板

  1. new TopVotedCandidate(…)的时候 参数会是两个数组 persons[]和times[]
    示例给的 [0, 1, 1, 0, 0, 1, 0], [0, 5, 10, 15, 20, 25, 30]
    表示 在第0分钟 给编号 为0的 选举人投票
    表示 在第5分钟 给编号 为1的 选举人投票
    表示 在第10分钟 给编号 为1的 选举人投票
    表示 在第15分钟 给编号 为0的 选举人投票
    表示 在第20分钟 给编号 为0的 选举人投票
    表示 在第25分钟 给编号 为1的 选举人投票
    表示 在第30分钟 给编号 为0的 选举人投票
    看出来了吗

  2. 使用实例化对象去调用方法
    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
    这个说明q方法就是用来输出在时刻x下 编号为 y 的候选人领先 return y;

题目分析完了 感觉可以做了
在这里 我就直接贴代码了 代码里面有详细的注释

class TopVotedCandidate {
    // map  key 代表着 人的编号   value 代表着 该人获得多少票
    Map<Integer, Integer> map1 = new HashMap();

    // 当前最多的票数
    int max = -1;
    //  当前最多的票数获得的人
    int maxPersonTemp = -1;

    int[] times;
    //  存放最多的票数获得的人  value代表着最多的票数获得的人  下标代表着times的下标  maxPerson[0]
    int maxPerson[];


    // 可以用map 存取
    public TopVotedCandidate(int[] persons, int[] times) {

        maxPerson = new int[persons.length];

        //todo 1.将 每一时刻的票数 进行统计
        for (int i = 0; i < persons.length; i++) {

            int p = persons[i];

            // map  key 代表着 人的编号   value 代表着 该人获得多少票
            // 这里的 map中 如果没有这个key   value的值就默认为一 然后加一 就是1了
            //            如果有的 这个 key   就将 value 的值返回出来  然后加1   也就是增加票数
            map1.put(p, map1.getOrDefault(p, 0) + 1);

            // 判断 当前这个增加票数的人 是否已经 是最大获取票数的人了
//              是的话将他存进maxPerson 中   并且将最大的  当前最多的票数 max 修改

            if (map1.get(p) >= max) {
                max = map1.get(p);
                maxPersonTemp = p;
            }
            maxPerson[i] = maxPersonTemp;
        }
        // 这里用不到times 在下面 二分法中才用到 times 所以将 times 提取出来 便于用在下面的q方法里面
        this.times = times;
    }

    public int q(int t) {

//        二分法查询
        int start = 0, end = maxPerson.length - 1;
        while (start < end) {
            int mid = (start + end + 1) /2 ;

            if (t >= times[mid]) start = mid;
            else end = mid - 1;
        }
        return maxPerson[start];
    }
}

主要是考虑用map去存储在当前时刻的获得最多票的获选人
有什么问题 欢迎一起讨论

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值