减少列表遍历器的执行时间

问题描述

我正在通过编码练习进行工作。我的逻辑是有道理的,但是执行限制超出了很大的列表。这是问题描述:

给出给每个候选人的票数数组 到目前为止,整数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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...