You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何降低Python脚本内存占用?以LeetCode三数之和问题为例

LeetCode 三数之和:内存超限问题的解决思路

我在解决LeetCode的三数之和问题时,代码能正常运行但触发了内存限制。试过减少变量数量,但效果不佳,想了解这类内存超限问题的解决思路。

我的实现代码:

class Solution(object):
    def threeSum(self, nums):
        
        duos = {}
        triple = {}
        for num1 in nums:
            del nums[nums.index(num1)]
            for num2 in nums :
                duos[tuple([num1,num2])] = num1 + num2
            nums.insert(0, num1)
       
        for duo in duos:
            del nums [nums.index(duo[0])]
            del nums [nums.index(duo[-1])]
            for num in nums:
                if duo[0] + duo[-1] + num == 0:
                    x = [duo[0],duo[-1],num]
                    x.sort()
                    triple[tuple(x)] = 1

            nums.insert(0,duo[0])
            nums.insert(0,duo[-1])
        return triple    

问题根源分析

你的代码内存超限的核心原因是预存了所有可能的二元组:

  • 当输入数组长度为n时,duos字典会存储O(n²)个键值对,比如n=1000时,就会有近100万条记录,直接占满内存。
  • 频繁对原数组执行del和insert操作,会导致列表频繁重新分配内存,增加额外的内存开销。
  • 用字典triple存储结果去重,虽然能达到目的,但也额外占用了不少内存。

内存优化核心思路

1. 放弃预存中间结果,改用实时遍历

不要提前把所有二元组都存起来,而是通过更高效的算法(比如排序+双指针)在遍历过程中直接寻找符合条件的三元组,完全避免O(n²)级别的内存占用。

2. 排序后直接去重,替代字典去重

排序后可以通过跳过重复元素的方式实现去重,不需要用字典存储结果,减少内存开销。

3. 避免修改原数组,改用索引遍历

原代码中删除、插入数组元素的操作既低效又浪费内存,直接用索引遍历排序后的数组即可。

优化后的代码示例

class Solution(object):
    def threeSum(self, nums):
        nums.sort()
        result = []
        n = len(nums)
        
        for i in range(n):
            # 跳过重复的第一个元素,避免生成重复三元组
            if i > 0 and nums[i] == nums[i-1]:
                continue
            
            left = i + 1
            right = n - 1
            target = -nums[i]
            
            while left < right:
                current_sum = nums[left] + nums[right]
                if current_sum == target:
                    result.append([nums[i], nums[left], nums[right]])
                    # 跳过left指针的重复元素
                    while left < right and nums[left] == nums[left+1]:
                        left += 1
                    # 跳过right指针的重复元素
                    while left < right and nums[right] == nums[right-1]:
                        right -= 1
                    # 移动指针寻找下一组可能
                    left += 1
                    right -= 1
                elif current_sum < target:
                    left += 1
                else:
                    right -= 1
        
        return result

通用内存超限问题解决思路

  • 定位内存大户:先找到代码中占用内存最多的对象(比如你的duos字典),这是优化的核心目标。
  • 削减冗余存储:避免预存所有可能的中间结果,尽量实时计算,尤其是当数据量达到平方级或更高时。
  • 换用低内存算法:很多时候内存超限是因为算法复杂度太高,比如用O(n²)的暴力枚举换成O(n²)时间但O(1)额外空间的双指针法(排序的空间开销可以忽略)。
  • 优化数据结构:用更节省内存的结构,比如用列表存储结果代替字典去重,用原地操作减少内存分配。

内容的提问来源于stack exchange,提问作者levlevon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:11:11