JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

  • 算法

  • algorithm
  • leetcode
JavaInterview.cn
2022-10-29
目录

在线选举Java

文章发布较早,内容可能过时,阅读注意甄别。

# 题目

给你两个整数数组 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

# 思路

// 首先,时间数组是严格递增的,每个候选人的得票数,随着时间的增加,同样是只增不减的。

// 那么,在获取某个时间得票最多的人,只要将 当前时间 获得 选票 的人的得票数,之前获得选票最多的人的得票数比较,就能知道,现在获取得票数最多的候选人是谁,然后我们更新当前时间选举领先的候选人编号即可。

// 由于 t 时刻很有可能没有任何选票,因此需要找到距离 t 时刻 之前最近时刻 的领先候选人,所以用一个有序集合维护某个时刻 t 领先的候选人编号,同时用一个hash表维护每个候选人的得票数。

TreeMap.floorEntry

# 解法


class TopVotedCandidate {
// 首先,时间数组是严格递增的,每个候选人的得票数,随着时间的增加,同样是只增不减的。

// 那么,在获取某个时间得票最多的人,只要将 当前时间 获得 选票 的人的得票数,之前获得选票最多的人的得票数比较,就能知道,现在获取得票数最多的候选人是谁,然后我们更新当前时间选举领先的候选人编号即可。

// 由于 t 时刻很有可能没有任何选票,因此需要找到距离 t 时刻 之前最近时刻 的领先候选人,所以用一个有序集合维护某个时刻 t 领先的候选人编号,同时用一个hash表维护每个候选人的得票数。


    // 人获得的票数
    Map<Integer,Integer> cntMap = new HashMap<>();
    // 当前时间领先的人
    TreeMap<Integer,Integer> tm = new TreeMap<>();
    public TopVotedCandidate(int[] persons, int[] times) {
        int maxPersonId = -1;
        for(int i = 0;i < persons.length;i++) {
            // 人的得票增加
            int cnt = cntMap.getOrDefault(persons[i],0) + 1;
            cntMap.put(persons[i],cnt);
            // 之前得票最多的人
            int maxCnt = cntMap.getOrDefault(maxPersonId,0);
            if(cnt >= maxCnt) {
                maxPersonId = persons[i];
            }
            // 维护当前时间得票最多的personId
            tm.put(times[i],maxPersonId);
        }
    }
    
    public int q(int t) {
        return tm.floorEntry(t).getValue();
    }
}

/**
 * Your TopVotedCandidate object will be instantiated and called as such:
 * TopVotedCandidate obj = new TopVotedCandidate(persons, times);
 * int param_1 = obj.q(t);
 */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

# 总结

  • 分析出几种情况,然后分别对各个情况实现
微信 支付宝
最近更新
01
1686. 石子游戏VI Java
08-18
02
1688. 比赛中的配对次数 Java
08-18
03
1687. 从仓库到码头运输箱子 Java
08-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式