【问题标题】:N/3 Repeat number linear solutionN/3 重复次数线性解
【发布时间】:2020-08-29 13:59:39
【问题描述】:

“给你一个只读的 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)。但这在线性时间内执行。谁能解释一下?

【问题讨论】:

  • 第一次在最坏的情况下以二次时间运行,因为A.count(b[i]) 花费的时间与A 的长度成正比。
  • 我不明白你对 O(n) 和线性时间的区别
  • 下界解是常数空间。

标签: algorithm python-2.7 dictionary time-complexity


【解决方案1】:

第二个代码的 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)。

有人提到你必须在常数空间而不是线性空间中解决这个问题。
您的两个解决方案都是线性空间。

常数空间和线性时间解是given here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 2019-02-09
    • 1970-01-01
    • 2019-02-23
    • 2020-01-18
    • 2016-04-19
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多