python-3.x - 这两种解决 leetcode 873 的算法在时间和空间复杂度上有什么区别?
问题描述
我刚刚解决了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]]
。
我在这里是因为在线评委将我的解决方案评为慢 4 倍2000ms
vs500ms
占用空间 345Mb
倍15Mb
。我可能遗漏了一些重要的东西,欢迎任何帮助。
解决方案
推荐阅读
- ios - 如何使用GraphicContext快速获得书法线刷效果
- android - 按钮背景的十六进制颜色 - Kivy
- typescript - 声明模块和导入定义
- c# - 错误 CS1514:意外符号“公共”,应为“。” 或'{'
- python - Python Selenium:StaleElementReferenceException / 设置 aria-pressed = "true"
- node.js - 当我在 cmd 中使用 npm start 启动我的反应应用程序时,我收到以下错误
- python - Python多处理不会提高性能
- caching - 为 Cloud CDN 的对象禁用浏览器缓存时出错(通过 Google Cloud Storage 的存储桶)
- java - android api 19中的logcat出现错误有什么解决方案吗?
- php - 我的记录没有被插入 MySQL 数据库