Online Election — Precompute Leader + Binary Search

Sanjeev SharmaSanjeev Sharma
1 min read

Advertisement

Problem 331 · Online Election

Difficulty: Medium · Pattern: Precompute + Binary Search

For query time t, return the person leading at time t.

Solutions

# Python
from collections import defaultdict
import bisect
class TopVotedCandidate:
    def __init__(self, persons, times):
        self.times = times
        self.leaders = []
        freq = defaultdict(int)
        leader = -1
        for p in persons:
            freq[p] += 1
            if leader == -1 or freq[p] >= freq[leader]:
                leader = p
            self.leaders.append(leader)

    def q(self, t):
        i = bisect.bisect_right(self.times, t) - 1
        return self.leaders[i]
// Java
class TopVotedCandidate {
    int[] times, leaders;
    public TopVotedCandidate(int[] persons, int[] times) {
        this.times=times; leaders=new int[times.length];
        Map<Integer,Integer> freq=new HashMap<>(); int leader=-1;
        for (int i=0;i<persons.length;i++) {
            freq.merge(persons[i],1,Integer::sum);
            if (leader==-1||freq.get(persons[i])>=freq.get(leader)) leader=persons[i];
            leaders[i]=leader;
        }
    }
    public int q(int t) {
        int lo=0,hi=times.length-1;
        while(lo<hi){int mid=lo+(hi-lo+1)/2;if(times[mid]<=t)lo=mid;else hi=mid-1;}
        return leaders[lo];
    }
}

Complexity

  • Constructor: O(n)
  • Query: O(log n)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro