Leetcode•Oct 11, 2026

Online Election

Hazrat Ali

Leetcode

For each query at a time t, find the person that was leading the election at time t. Votes cast at time t will count towards our query. In the case of a tie, the most recent vote (among tied candidates) wins.

Implement the TopVotedCandidate class:

  • TopVotedCandidate(int[] persons, int[] times) Initializes the object with the persons and times arrays.
  • int q(int t) Returns the number of the person that was leading the election at time t according to the mentioned rules.

 

Example 1:

Input
["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]]
Output
[null, 0, 1, 1, 0, 0, 1]

Explanation
TopVotedCandidate topVotedCandidate = new TopVotedCandidate([0, 1, 1, 0, 0, 1, 0], [0, 5, 10, 15, 20, 25, 30]);
topVotedCandidate.q(3); // return 0, At time 3, the votes are [0], and 0 is leading.
topVotedCandidate.q(12); // return 1, At time 12, the votes are [0,1,1], and 1 is leading.
topVotedCandidate.q(25); // return 1, At time 25, the votes are [0,1,1,0,0,1], and 1 is leading (as ties go to the most recent vote.)
topVotedCandidate.q(15); // return 0
topVotedCandidate.q(24); // return 0
topVotedCandidate.q(8); // return 1

Solution
var TopVotedCandidate = function(persons, times) {
    this.times = times;
    this.leaders = [];

    const votes = new Map();
    let leader = -1;
    let maxVotes = 0;

    for (let i = 0; i < persons.length; i++) {
        const person = persons[i];
        const count = (votes.get(person) || 0) + 1;

        votes.set(person, count);

        if (count >= maxVotes) {
            maxVotes = count;
            leader = person;
        }

        this.leaders.push(leader);
    }
};

TopVotedCandidate.prototype.q = function(t) {
    let left = 0;
    let right = this.times.length - 1;
    let answer = 0;

    while (left <= right) {
        const mid = Math.floor((left + right) / 2);

        if (this.times[mid] <= t) {
            answer = mid;
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    return this.leaders[answer];
};
 

Comments