题目地址:https://leetcode.com/problems/online-election/description/
题目描述:
Inan election, the i-th vote was cast for persons[i] at time times[i].
Now, we would like to implement the following query function: TopVotedCandidate.q(int t) will return the number of 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.
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:
At time 3, the votes are [0], and 0 is leading.
At time 12, the votes are [0,1,1], and 1 is leading.
At time 25, the votes are [0,1,1,0,0,1], and 1 is leading (as ties go to the most recent vote.)
This continues for 3 more queries at time 15, 24, and 8.
Note:
1、 1<=persons.length=times.length<=5000;
2、 0<=persons[i]<=persons.length;
3、 timesisastrictlyincreasingarraywithallelementsin[0,10^9].;
4、 TopVotedCandidate.qiscalledatmost10000timespertestcase.;
5、 TopVotedCandidate.q(intt)isalwayscalledwitht>=times[0].;
题目大意
题目意思是在一个竞选中,在times[i]时刻会投票给persons[i],然后求t时刻的得票最多的候选人。注意,如果出现票数相等的情况,选择获得最新投票的那个。
解题方法
这个题很容易想到实现一个保存了当前出现次数最多数字的栈。类似的题目还有实现一个保存最小值的栈。
如果把这个题目这么抽象出来之后,会发现,只需要再增加一个二分查找代码就好了。
所以这个题使用List保存每个时间点对应的当前的获得票数最多的person。在q(t)中,使用二分查找到第一个小于t的times位置,然后返回这个位置对应的时间得票最多的person即可。
平均的时间复杂度是O(logn),空间复杂度是O(N).
代码如下:
class TopVotedCandidate(object):
def __init__(self, persons, times):
"""
:type persons: List[int]
:type times: List[int]
"""
self.leads, self.times, count = [], times, {}
lead = -1
for p, t in zip(persons, times):
count[p] = count.get(p, 0) + 1
if count.get(lead, 0) <= count[p]:
lead = p
self.leads.append(lead)
def q(self, t):
"""
:type t: int
:rtype: int
"""
l, r = 0, len(self.times) - 1
while l <= r:
mid = (l + r) // 2
if self.times[mid] == t:
return self.leads[mid]
elif self.times[mid] > t:
r = mid - 1
else:
l = mid + 1
return self.leads[l - 1]
# Your TopVotedCandidate object will be instantiated and called as such:
# obj = TopVotedCandidate(persons, times)
# param_1 = obj.q(t)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
参考资料:
https://leetcode.com/problems/online-election/discuss/173382/C++JavaPython-Binary-Search-in-Times
DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有
本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发