- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
题目地址: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 弟弟快看-教程,程序员编程资料站,版权归原作者所有
本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发
我有这些数据: library(tidyverse) df % summary() 我收到此错误: Error in lm.fit(x, y, offset = offset, singular
我有一个运行着 3 个实例的工作 Zookeeper 集合,还有一个带有一些 solr 实例的 solrcloud 集群。我创建了一个设置为 2 个分片的集合。然后我: create 1 core o
etcd v3 的新主要版本引入了新的并发原语。其中之一是选举。 该 api 不支持开始事件并返回(其他)获胜者,这意味着我们需要查询领导者。这使得事情变得复杂,因为现在我们有两条并发路径,一条运行事
我试图理解 etcd election api 提供的各种功能以及它们在语义上的含义。 在他们的官方文档中非常简单地提到了每个功能的作用,并且没有提供示例。例如我们有方法: func (e *Elec
我正在尝试使用 JDBC 在 spring-integration 中使用领导者选举。只要连接了数据库,它就可以工作。一旦数据库连接断开,领导者选举就会停止,该节点上的领导者信息将保持不变。 据我对代
我是一名优秀的程序员,十分优秀!