在选举中,第 i 张票是在时间为 times[i] 时投给 persons[i] 的。
现在,我们想要实现下面的查询函数: TopVotedCandidate.q(int t) 将返回在 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]
解释:
时间为 3,票数分布情况是 [0],编号为 0 的候选人领先。
时间为 12,票数分布情况是 [0,1,1],编号为 1 的候选人领先。
时间为 25,票数分布情况是 [0,1,1,0,0,1],编号为 1 的候选人领先(因为最近的投票结果是平局)。
在时间 15、24 和 8 处继续执行 3 个查询。
代码
class TopVotedCandidate {int[] helper,time;int n;public TopVotedCandidate(int[] persons, int[] times) {int max=0,maxP=-1;n=times.length;Map<Integer,Integer> map=new HashMap<>();helper=new int[n];time=times;for (int i=0;i<n;i++)//计算每个时间节点的赢家{map.put(persons[i],map.getOrDefault(persons[i],0)+1);if(map.get(persons[i])>=max)//更换赢家{max=map.get(persons[i]);maxP=persons[i];}helper[i]=maxP;}}public int q(int t) {int l=0,r=n-1;while (l<=r)//二分查找目标时间节点{int mid=(r-l)/2+l;if(time[mid]==t)return helper[mid] ;else if(time[mid]<t)l=mid+1;else r=mid-1;}return helper[l-1];}}/*** Your TopVotedCandidate object will be instantiated and called as such:* TopVotedCandidate obj = new TopVotedCandidate(persons, times);* int param_1 = obj.q(t);*/