【发布时间】:2021-12-30 21:55:33
【问题描述】:
我正在尝试解决FibFrog Codility 问题,我想出了以下方法:
- 如果
len(A)为 0,我们知道我们可以一次跳跃到达另一边。 - 如果
len(A) + 1是一个斐波那契数,我们也可以一跳就到。 - 否则,我们遍历 A,对于我们可以到达的位置,我们检查是否可以使用斐波那契数
(idx + 1 in fibonaccis)从 -1 直接到达它们,或者我们是否可以通过首先跳转到另一个位置来到达它们 (reachables) 然后跳转到当前位置。在这两种情况下,我们还会检查是否可以从当前位置走到河流的尽头 - 如果可以,那么我们可以返回,因为我们找到了所需的最少步数。 - 最后,如果
unreachable是True,一旦此循环完成,这意味着我们无法使用斐波那契数到达任何位置,因此我们返回 -1。
我是getting 83% 的正确性和 0% 的性能使用这种方法。
我知道解决方案是 O(n^2),假设数组仅包含 1,嵌套循环 for v in reachables: 将运行 n 次 - 但是我不确定我还能如何计算它,因为对于我需要检查的每个位置是否可以从数组的开头或使用斐波那契数的任何先前位置到达。
def solution(A):
if len(A) == 0: return 1
fibonaccis = fibonacci(len(A) + 3)
if len(A) + 1 in fibonaccis: return 1
leaves = [0] * len(A)
unreachable = True
reachables = []
for idx, val in enumerate(A):
if val == 1:
if idx + 1 in fibonaccis:
unreachable = False
leaves[idx] = 1
if len(A) - idx in fibonaccis:
return 2
reachables.append(idx)
elif len(reachables) > 0:
for v in reachables:
if idx - v in fibonaccis:
leaves[idx] = leaves[v] + 1
if len(A) - idx in fibonaccis:
return leaves[v] + 2
reachables.append(idx)
break
if unreachable: return -1
if len(A) - reachables[-1] in fibonaccis:
return leaves[reachables[-1]] + 1
def fibonacci(N):
arr = [0] * N
arr[1] = 1
for i in range(2, N):
arr[i] = arr[i-1] + arr[i-2]
return arr
【问题讨论】:
-
可能是重复的 - stackoverflow.com/questions/51625022
-
这绝对不是重复的,因为您链接的问题是在 Java 中,而且它也是一个完全不同的实现 - 我问的是我的解决方案具体有什么问题,而不是如何以不同的方式解决这个问题在 Java 中。
-
它不起作用 - 正如我在问题中提到的那样,它有 83% 的正确性。
-
有 O(log N) 个斐波那契数
标签: python algorithm time-complexity fibonacci