问题描述
我正在通过编码练习进行工作。我的逻辑是有道理的,但是执行限制超出了很大的列表。这是问题描述:
给出给每个候选人的票数数组 到目前为止,整数k等于尚未投票的选民人数 进行投票,找出仍有 机会赢得大选。
选举获胜者必须获得比任何人更多的选票 其他候选人。如果两个或多个候选人获得相同(最多) 投票数,假设根本没有赢家。
示例
对于票= [2,3,5,2]和k = 3,输出应为 lectionsWinners(votes,k)= 2。
第一位候选人获得2票。即使其余3个 候选人投票给他,他仍然只有5票,即 与第三名候选人人数相同,因此不会有中奖者。的 如果其余所有候选人都为他投票,第二名候选人可以获胜 (3 + 3 = 6> 5)。即使没有任何候选人,第三名候选人也可以获胜。 其余候选人为他投票。例如,如果每个 剩下的选民为他的每个反对者投票,他将 仍然是赢家(因此,票数数组将为[3,4,5,5,3])。的 最后一位候选人无论如何都无法赢得比赛(出于与 第一候选人)。因此,只有2名候选人可以获胜(第二名和 第三),这就是答案。
这是我的逻辑。我知道,对于这个问题,我必须遍历列表中的每个元素,以查看添加k是否会使它成为列表中的最大值。但我也觉得我必须检查列表中该值的出现次数,以正确确定是否有赢家或平局:
def electionsWinners(votes,k):
# This variable basically counts the number of possible winners in the list
counter = 0
for i in votes:
# If all votes go into candidate i and its not a tie:
if k + i > max(votes) and votes.count(k + i) <= 1:
# Increment one because we have a potential winner
counter += 1
# If there are no remaining votes and the biggest value of the list only occures once
elif k == 0 and votes.count(max(votes)) == 1:
# We only have one winner
counter = 1
return counter
我知道我使用list.max()
和list.count()
会增加执行时间。我可以通过哪些方法使此代码运行更快?
尽管我感谢所有帮助,但看到人们发表的只是简单答案却令人沮丧。这不是功课。它的目的是练习,因此您给我答案对我完全没有帮助。请让我知道如何修复现有代码。谢谢大家。
解决方法
一些可以优化的东西:
-
space
不依赖于max(votes)
的值,因此不应在每次循环迭代中对其进行评估。在循环开始前对其进行一次评估。 -
表达式
i
也是如此。它不依赖于循环变量,因此不应在循环中发生。它应该成为确定是否应执行循环的条件。 -
k == 0 and votes.count(max(votes)) == 1
:如果条件的第一部分为true,则条件的第二部分始终为true。当k + i > max(votes) and votes.count(k + i) <= 1
大于列表中的最大值时,该总数根本不会出现在列表中,即计数为零。
因此,所有这些都可以写成:
k + i
您可以使用def electionsWinners(votes,k):
greatest = max(votes)
if k == 0:
if votes.count(greatest) == 1:
return 1
else:
return 0
counter = 0
for i in votes:
if k + i > greatest:
counter += 1
return counter
代替“手动” sum
来获得微薄的收益。同时也可以减少代码:
counter += 1
甚至:
def electionsWinners(votes,k):
greatest = max(votes)
if k == 0:
return int(votes.count(greatest) == 1)
return sum(1 for i in votes if k + i > greatest)