我刚刚解决了https://leetcode.com/problems/length-of-longest-fibonacci-subsequence/。目的是在严格增加的整数数组中找到最长的斐波那契子序列。
我需要一些帮助来弄清楚解决方案与我从leetcode的解决方案部分获得的“最佳”解决方案之间在时间和空间复杂度上的区别。
1-我的算法:
class Solution:
def lenLongestFibSubseq(self, A):
dp = [collections.defaultdict(int) for i in range(len(A))]
res = 2
for j in range(len(A)):
for i in range(j):
prev = dp[i].get(A[j], 0)
prev = 2 if not prev else prev+1
dp[j][A[j]+A[i]] = prev
res = max(res, prev)
return res if res > 2 else 0
2-“最佳”算法:
class Solution:
def lenLongestFibSubseq(self, A):
dp = collections.defaultdict(int)
s = set(A)
for j in range(len(A)):
for i in range(j):
if A[j] - A[i] < A[i] and A[j] - A[i] in s:
dp[A[i], A[j]] = dp.get((A[j] - A[i], A[i]), 2) + 1
return max(dp.values() or [0])
时间复杂度很容易->它们都是O(n^2)
对于空间复杂度,我认为两者都是O(n^2)
,至少我是肯定的,因为对于每个索引,我都会维护一个等于index-1
的字典。
但是,“最优”算法似乎也有O(n^2)
个空间,因为他正在为所有对[A[i], A[j]]
缓存一个值。
我之所以在这里,是因为在线法官对我的解决方案的评价是2000ms
比500ms
慢4倍,而空间消耗45Mb
与15Mb
却是3倍。我可能错过了一些大事,欢迎任何帮助。