Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python字典的空间复杂性_Python_Python 3.x_Algorithm_Space Complexity - Fatal编程技术网

python字典的空间复杂性

python字典的空间复杂性,python,python-3.x,algorithm,space-complexity,Python,Python 3.x,Algorithm,Space Complexity,这是一个利兹密码问题 他们在说: 不能修改数组(假定数组为只读)。 只能使用常量O(1)额外空间。 您的运行时复杂性应小于O(n^2)。 数组中只有一个重复的数字,但可以重复多次 因此,在我的代码中,我使用python中的集合创建了一个字典 我的代码是如何满足这一行“必须只使用常量,O(1)额外空间”的要求的。这一行的意思是什么?它们考虑了空间复杂性。下面是我的代码,它清除了所有测试用例 from collections import Counter class Solution:

这是一个利兹密码问题

他们在说:

不能修改数组(假定数组为只读)。 只能使用常量O(1)额外空间。 您的运行时复杂性应小于O(n^2)。 数组中只有一个重复的数字,但可以重复多次

因此,在我的代码中,我使用python中的集合创建了一个字典

我的代码是如何满足这一行“必须只使用常量,O(1)额外空间”的要求的。这一行的意思是什么?它们考虑了空间复杂性。下面是我的代码,它清除了所有测试用例

from collections import Counter 

class Solution:
    
    def findDuplicate(self, nums: List[int]) -> int:
        
        dict1=Counter(nums)
        
        for i in dict1:
            if(dict1[i]>1):
                return(i)

请帮忙。提前感谢。

通常,字典的空间复杂度总是
O(N)
,因为它取决于数组的元素数

空间复杂度
O(1)
意味着无论数组大小,指针的数量都相同。例如,如果在搜索算法中使用布尔变量来获取副本,这意味着
O(1)

旁注:

另一件事是运行时的复杂性,对于字典来说,它是
O(1)
,因为它们基于哈希表,您只需要一个键就可以获得值。相反,要在列表中查找特定的值,运行时的复杂性是
O(N)
,因为在最坏的情况下,您必须迭代所有元素。

字典占用O(N)空间,因此您的解决方案占用O(N)空间,并且违反了O(1)空间要求


这是一个古老的LeetCode问题,当时LeetCode的重点是工作面试,在面试中可以提出并讨论这些需求(过去常常在LeetCode论坛上讨论)。LeetCode系统从来没有强制执行它,这就是为什么您的解决方案尽管违反了要求,但仍然被接受的原因。到目前为止,LeetCode已经成为了一个以竞争为中心的网站,并且已经变得和其他任何编码挑战网站一样:重要的是你的解决方案是否被接受,现在如何接受。他们仍然没有(不能?)执行这样的空间要求,我认为他们的新问题不再要求这样的东西了。我怀念过去。

你的主要问题已经回答了。对于此问题,我们建议使用二进制搜索:

class Solution:
    def findDuplicate(self, nums):
        lo, hi = 0, len(nums) - 1
        mid = (lo + hi) // 2
        while hi - lo > 1:
            count = 0
            for num in nums:
                if mid < num <= hi:
                    count += 1
            if count > hi - mid:
                lo = mid
            else:
                hi = mid
            mid = (lo + hi) // 2
        return hi
类解决方案:
def查找副本(自身、nums):
lo,hi=0,len(nums)-1
mid=(低+高)//2
当hi-lo>1时:
计数=0
对于num中的num:
如果mid<数值hi-mid:
lo=中
其他:
高=中
mid=(低+高)//2
回电

工具书类
  • 有关其他详细信息,请参见。这里有很多公认的解决方案,有各种解释和解释,有高效的算法,还有渐近/复杂性分析

您能详细说明O(1)的空间复杂性吗?我已经详细说明了一点。基本上,这意味着您只能在算法中使用一个变量(即布尔值)。是的,这是一个关于复杂性的好问题。这不像现代问题那么简单,在现代问题中,这不再重要。提示:尝试找到一个解决方案,就好像只有一个int变量来存储数据一样。