这个问题是posed by another user,但是他没有提供任何文档。在这个问题中,我提供了该文档。
让我们直接跳到一个示例,该示例显示Leetcode Python3内存消耗所显示的矛盾数据以及4Sum问题。
我自己的解决方案消耗了13 MB的内存(正如我所有的Python解决方案一样!)。但是也许我的代码编写得很差,所以让我们将我的代码与其他解决方案进行比较...
使用用于该问题的统计信息页面,我发现性能最佳的解决方案(wrt内存)出现在12,220 kb
:
此代码的源可通过api here(登录后)获得;它也粘贴到该问题的末尾。
现在,让我们复制/粘贴此解决方案以确认它是否在指定的12,220 kb
中出现。
如下图所示,陈述 12,220 kb
解决方案(“几秒钟前”)消耗的内存量与我的代码(“两天前”)相同,高达13.2 MB:
问题是,为什么即使使用Leetcode亲自引用的代码消耗了12,220 千字节千字节,所有的Python提交都始终消耗约13MB的内存?
edit:(Leetcode使用缩写kb
(千字节),但我相信它们的实际含义是kB
(千字节),因为它们引用了我的13 MB提交内容,范围约为13,000 kb。尽管命名格式不正确,但仍无法解释为什么以13.2 MB的速度提供了12,220千字节的解决方案。
为完整起见,以下是假定的12,220 kb
解决方案的代码:
class Solution:
def fourSum(self, nums: 'List[int]', target: 'int') -> 'List[List[int]]':
if len(nums) < 4:
return []
nums = sorted(nums)
solution_sets = []
for p1 in range(len(nums) - 3):
if nums[p1] * 4 > target or nums[-1] * 4 < target:
continue
if p1 > 0 and nums[p1] == nums[p1-1]:
continue
for p2 in range(p1 + 1, len(nums) - 2):
if p2 > p1 + 1 and nums[p2] == nums[p2-1]:
continue
l = p2 + 1
r = len(nums) - 1
while l < r:
curr_sum = nums[p1] + nums[p2] + nums[l] + nums[r]
if curr_sum > target:
while l < r and curr_sum > target:
r -= 1
curr_sum = nums[p1] + nums[p2] + nums[l] + nums[r]
elif curr_sum < target:
while l < r and curr_sum < target:
l += 1
curr_sum = nums[p1] + nums[p2] + nums[l] + nums[r]
else:
solution_set = (nums[p1], nums[p2], nums[l], nums[r])
solution_sets.append(solution_set)
l += 1
while l < r and nums[l-1] == nums[l]:
l += 1
r -= 1
while l < r and nums[r+1] == nums[r]:
r -= 1
return solution_sets