algorithm - N/3 重复次数线性解
问题描述
“给定一个包含 n 个整数的只读数组。找出是否有任何整数在线性时间和恒定附加空间中出现超过 n/3 次。如果是,则返回整数。如果不是,则返回 -1。如果有多个解决方案,返回任何一个"
对于上述问题,我有两个答案,其中一个是在线性时间内被接受的。
这个没有被接受(部分接受)TLE
def repeatedNumber(self, A):
A=list(A)
n=len(A)
b=list(set(A))
if(len(A)==1 or len(A)==2):
return A[0]
if(len(b)==n):
return(-1)
for i in range(len(b)):
if(A.count(b[i])>n//3):
return b[i]
return(-1)
此代码正在被接受
def repeatedNumber(self, A):
A=list(A)
n=len(A)
ck={}
for i in A:
if i not in ck:
ck[i]=1
else:
ck[i]+=1
if(ck[i]>n/3):
return i
return(-1)
此代码在线性运行时被接受。虽然 for 循环运行 n 次,但时间复杂度应该是 O(n)。但这在线性时间内执行。谁能解释一下?
解决方案
第二个代码的TC 是 O(n)所以它被接受了。这是 O(n),因为您使用的是字典,并且为给定键提取值的平均 TC 是常数 O(1)。
第一个代码的 TC 是 O(n^2)而不是 O(n),因为 Python 中的 count 函数的平均 TC 为 O(n),并且您在 for 循环中使用它也是 O(n),因此净 TC是 O(n^2) 这就是为什么它没有被接受
两种解决方案的空间复杂度均为 O(n)。
有人提到你必须在恒定空间而不是线性空间中解决这个问题。
您的两个解决方案都是线性空间。
这里给出了恒定空间和线性时间的解决方案
推荐阅读
- ios - 在 iOS 10 上从自定义键盘打开设置应用程序时崩溃
- c# - 如何为另一个类的测试参数设置 IEqualityComparer?
- html - overscroll-behavior 属性不适用于 webview
- docker - 节点 API 失败并出现错误:EHOSTUNREACH
- assembly - S1.geti、S2.geti 都调用同一个过程(称为 Sc_geti)。S1.i 不可用。奇怪的字符
- javascript - 在 parseFloat() 之后将对象键数组中的所有值相加
- javascript - 无法选中第二个循环内的复选框
- python - 使用fuzzywuzzy合并数据框
- solr - Solr MoreLikeThis 处理程序返回 0 个元素
- javascript - Apollo Query 组件如何使用它的自身值作为回调