【问题标题】:Reducing the execution time of a list traverser减少列表遍历器的执行时间
【发布时间】:2020-09-28 04:38:49
【问题描述】:

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

给定每个候选人的投票数数组 到目前为止,一个整数 k 等于没有投票的选民的数量 投下他们的票,找出还有多少候选人 chance to win the election.

选举的获胜者必须获得比任何人都多的选票 其他候选人。如果两个或多个候选人收到相同的(最大) 票数,假设根本没有赢家。

例子

对于 votes = [2, 3, 5, 2] 和 k = 3,输出应该是 选举Winners(votes, k) = 2.

第一位候选人获得 2 票。即使剩下的 3 候选人投票给他,他仍然只有 5 票,即 与第三名候选人相同,因此不会有获胜者。这 如果所有剩余的候选人都投票给他,则第二个候选人可以获胜 (3 + 3 = 6 > 5)。即使没有一个候选人,第三个候选人也可以获胜 其余候选人投票给他。例如,如果每个 剩下的选民为他的每个反对者投票,他将 仍然是赢家(因此投票数组将是 [3, 4, 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() 会增加执行时间。有哪些方法可以让这段代码运行得更快?

虽然我感谢所有帮助,但看到人们只发布一个简单的答案是非常令人沮丧的。这不是家庭作业。它是为了练习,所以你给我答案对我一点帮助都没有。让我知道如何修复我现有的代码。提前谢谢大家。

【问题讨论】:

  • max(votes) 的值不会改变,不应该在每次迭代中计算。
  • @KlausD。谢谢!

标签: python algorithm execution-time


【解决方案1】:

一些可以优化的地方:

  • max(votes) 不依赖于i 的值,因此不应在每次循环迭代中对其进行评估。在循环开始之前对其进行一次评估。

  • 表达式k == 0 and votes.count(max(votes)) == 1 也是如此。它不依赖于循环变量,所以它不应该出现在循环中。它应该成为决定是否执行循环的条件。

  • k + i &gt; max(votes) and votes.count(k + i) &lt;= 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)

甚至:

def electionsWinners(votes, k):
    mx = max(votes)
    return sum(1 for i in votes if k + i > mx) if k else int(votes.count(mx) == 1)

【讨论】:

    猜你喜欢
    • 2012-12-31
    • 1970-01-01
    • 2017-07-10
    • 2021-12-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多