Online Election — Precompute Leader + Binary Search
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