题目
给你两个整数数组 persons 和 times 。在选举中,第 i 张票是在时刻为 times[i] 时投给候选人 persons[i] 的。
对于发生在时刻 t 的每个查询,需要找出在 t 时刻在选举中领先的候选人的编号。
在 t 时刻投出的选票也将被计入我们的查询之中。在平局的情况下,最近获得投票的候选人将会获胜。
实现 TopVotedCandidate 类:
TopVotedCandidate(int[] persons, int[] times) 使用 persons 和 times 数组初始化对象。
int q(int t) 根据前面描述的规则,返回在时刻 t 在选举中领先的候选人的编号。
解题思路
由于 times
数组是单调递增,可以把 times
数组中每个时刻的当选人求出来,查询的时候直接查询最近的时间,给出输出即可。
代码
class TopVotedCandidate {
List<Integer> result;
private int[] times;
private int[] persons;
private int length;
public TopVotedCandidate(int[] persons, int[] times) {
this.times = times;
this.length = times.length;
this.persons = persons;
this.result = new ArrayList<>();
Map<Integer, Integer> map = new HashMap<>();
map.put(-1, -1);
int nowResult = -1;
for (int person : persons) {
map.put(person, map.getOrDefault(person, 0) + 1);
if (map.get(person) >= map.get(nowResult)) {
nowResult = person;
}
result.add(nowResult);
}
}
public int q(int t) {
int left = 0, right = length - 1;
while (left < right) {
int mid = left + (right - left + 1) / 2;
if (times[mid] <= t) left = mid;
else right = mid - 1;
}
return this.persons[left];
}
}