[英]what approach is best to decrease the time complexity of this problem
我想通过声明我仍在学习数据结构和算法的基础知识来为这个主题做序,我不是在寻找解决这个问题的正确代码,而是在寻找正确的方法。 这样我就可以了解什么情况需要哪种数据结构。 话虽如此,我现在将尝试正确解释这段代码。
下面的代码是我为中级 leetcode 问题编写的解决方案。 请查看链接以阅读问题
如果我错了请纠正我,目前这个算法的时间复杂度是 O(n)
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]):
startingStation = 0
didCircuit = -1
tank = 0
i = 0
while i <= len(gas):
if startingStation == len(gas):
return -1
if startingStation == i:
didCircuit += 1
if didCircuit == 1:
return startingStation
tank += gas[i] - cost[i]
if tank >= 0:
i += 1
if i == len(gas):
i = 0
if tank < 0:
didCircuit = -1
startingStation += 1
i = startingStation
tank = 0
代码运行良好,但时间复杂度太慢,无法遍历每个测试用例。 我要问的是如果这个算法是 O(n) 我可以使用什么方法来使这个算法的运行时复杂度为 O(log(n)) 或更快?
附带问题 - 我知道有很多 if 语句是糟糕且丑陋的代码,但是如果所有迭代都是 O(1),如果缩放到高迭代计数,if 语句的数量是否会对这个 function 的性能产生任何影响?
“如果我错了请纠正我,目前这个算法的时间复杂度是 O(n)”
该算法是 O(n^2) 而不是 O(n)。 在最好的情况下,它只会在 while 循环的“n”次迭代中返回一个答案,但在没有答案的情况下,它需要运行循环 (n*(n+1))/2 次。
O() 符号告诉我们忽略 n 的实际值,并删除随着 n 变得非常大而变得无关紧要的项。 所以我们在迭代中忽略 +n 和 /2,最重要的部分是 n^2。
所以它是一个 O(n^2) 算法。
“如果所有迭代都是 O(1),如果缩放到高迭代计数,if 语句的数量是否会对这个 function 的性能有任何影响”
不,算法的 O() 不受逻辑语句数量的影响,但要注意隐藏循环和昂贵的操作。 例如,一个逻辑语句if x in list
可以是 O(n) 列表中的项目数而没有数据特定的优化,所以如果你有一个 O(n) 循环(对于同一个列表)你可以有一个 O(n^2) 算法。 您的逻辑语句都没有这个问题,您可以出于 O() 目的忽略它们。
作业可以同样对待。
“我要问的是,如果这个算法是 O(n),我可以使用什么方法来使这个算法的运行时复杂度为 O(log(n)) 或更快?”
由于该算法不是 O(n),最好问问您如何到达那里。 您可以通过找到一种不必多次循环 arrays 的方法来实现。
你问的是数据结构,却说的是时间复杂度。
在这种情况下,最好的算法在时间上是 O(n),在额外空间上是 O(1)。 除了两个 arrays 之外,它还需要你存储一个 integer。如果你不断从数据流中读取 gas 和成本值,你甚至可以用三个整数存储来实现它。
“我不是在寻找解决这个问题的正确代码,而是在寻找正确的方法”
他们给你的礼物是任何成功的解决方案都是独一无二的。 由此我们知道,可用的gas量不超过所有成本的总和加上一个站的成本和gas之间的最小差值。 如果不是这样,那么循环中将有两个点可以开始。
这意味着一旦我们找到一个i
,其中 0 到i
站的可用汽油总和超过从 0 到i
的旅行成本,我们就会找到唯一的起始点 position。如果我们到达该行的末尾并且有没有找到这个,我们知道不可能对任何起始 position 这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.