【发布时间】:2019-02-09 04:42:14
【问题描述】:
我正在尝试解决 HackerRank 上的this 问题,该问题要求您对整数列表进行排序并找出一个数字被移动了多少次才能按正确的升序排列(问题上下文中的贿赂) .
我的代码通过了 12 个测试用例中的 8 个,但是当输入太大并出现超时错误时失败。这似乎是 HackerRank 上的一个常见指标,即代码对于手头的问题来说太慢了。那么有没有办法优化这段代码,让它在更大的数据集上运行得更快呢?
def minimum_bribes(queue):
"""Returns the minimum number of bribes people in a queue accepted."""
# Variable to keep track of bribes
bribes = 0
# Check if queue is too chaotic
for i in queue:
index = queue.index(i)
if i - index > 3:
return "Too chaotic"
# Use a bubble sort to find number of bribes
for i in range(len(queue) - 1):
for j in range(len(queue) - 1 - i):
if queue[j] > queue[j + 1]:
queue[j], queue[j + 1] = queue[j + 1], queue[j]
bribes += 1
return bribes
# Number of test cases
t = int(input())
results = []
for _ in range(t):
# Number of people
n = int(input())
# Final State of queue
q = list(map(int, input().rstrip().split()))
# Add bribe counts to results array
results.append(minimum_bribes(q))
# Print results
for result in results:
print(result)
【问题讨论】:
-
问题的链接好像失效了...
-
嗯,你确定吗?它在不同的浏览器上对我有用。
-
除其他问题外,您可能希望修复初始循环检查过于混乱;你把它写成
O(n**2)算法(因为queue.index是O(n)而你称它为n次)。您可以简单地简化为for index, i in enumerate(queue):(完全删除index = queue.index(i)),因为enumerate非常乐意同时为您提供价值和索引,将O(n**2)工作减少到O(n)工作。 -
当然,loop执行的测试也乍一看似乎是错误的;一个人最多可以贿赂另外两个人,但这并不会限制生产线的变动;排队的第二个人可以贿赂第一个切换,然后第三个人可以贿赂他们,依此类推,这样排队的每个人都向前移动一个位置,除了第一个人,他从前到后移动。关键是,任何过度混乱的测试都不能天真地根据任何一个人的位置来检查。
-
@pbegle,它现在又可以工作了……不知道为什么昨天没有
标签: python-3.x optimization bubble-sort