所以我被问到一个奇怪的倒置K最佳候选人问题。正常的问题如下。
给出一个'投票列表'这是时间戳的元组和下面的候选人:
(111111, Clinton)
(111111, Bush)
...
以最多票数返回前K名候选人。
它是一个典型的问题,解决方案是使用候选的hashmap>在时间戳绑定范围内的投票也构建一个大小为K的最小堆,其中堆的顶部基本上是易于被弹出的候选者K最佳候选人。
最后你返回堆。
但最后我被问到:给出K候选人名单,返回与这些候选人匹配的时间戳作为K最佳候选人。我不确定我是否100%正确地回忆这个问题,因为它必须是这些K候选人中第一次出现的最佳选择,或者我会得到他们的投票结果。
答案 0 :(得分:0)
如果我理解了所有内容,votes
是一个投票元组列表,由投票的候选人和投票的时间戳组成。 currTime
是在此之前的时间戳期间所有投票的时间戳。 topCandidates
是currTime
投票率最高的候选人。
您的第一个问题是votes
和currTime
,您需要返回topCandidates
。您的第二个问题是votes
和topCandidates
,您应该返回currTime
。
关注第二个问题,我会制作一个地图,其中键是时间戳,值是当时正在进行的所有投票。此外,我还会创建另一个地图,其中关键是候选人,价值是他们到目前为止的投票数。我将以第一张地图的升序时间戳顺序遍历第一张地图,获得在时间戳上投下的所有投票,并按候选人(关键字)递增第二张地图的值。在浏览下一个时间戳之前,我会在第二张地图中创建一个投票最多的候选人列表。如果该列表与topCandidates
匹配,则您遍历的最后一个时间戳为currTime
。
在python中编写代码:
from collections import Counter, defaultdict
def findCurrTime(votes, topCandidates):
if not (votes and topCandidates):
return -1
votesAtTime = defaultdict(list)
candidatePoll = Counter()
k = len(topCandidates)
for time, candidate in votes: # votes = [(time0, candidate0), ...]
votesAtTime[time].append(candidate)
for ts in votesAtTime:
candidatePoll += Counter(voteAtTime[ts])
if list(map(lambda pair: pair[0],candidatePoll.most_common(k))) == topCandidates:
return ts
# if topCandidates cannot be created from these votes:
return -1
我做了一些假设(你希望问你的面试官)。我假设topCandidates
的顺序对Counter.most_common
处理的事项很重要,尽管它不会处理具有投票数的候选人。
时间复杂度为O(t * n * log(k)),其中t是时间戳的数量,n是投票数,k是topCandidates
的大小。这是因为Counter.most_common
looks to be O(n*log(k)),它可以运行t
次。肯定有更有效的答案。