You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

LeetCode 53题扩展问题:最大和子数组返回代码的错误排查与修复咨询

LeetCode 53题扩展问题:最大和子数组返回代码的错误排查与修复咨询

嘿,我来帮你揪出这段代码里的问题,然后给你修复方案!

首先,你遇到的核心问题是列表的引用赋值导致的同步修改。咱们来拆解一下:
当你执行max_subarray = cur_array的时候,并没有生成一个新的独立列表,而是让max_subarraycur_array指向了内存里同一个列表对象。后面不管你给cur_array追加元素,还是调用clear()清空它,max_subarray都会跟着一起变——这就是为什么最后返回的总是cur_array当前的内容,而不是你当时想要保存的那个最大和子数组。

另外还有几个小细节需要调整:

  • 初始值设置不够严谨:比如max_subarray初始是空列表,如果输入数组全是负数(比如[-5,-3,-2]),你的代码最后会返回空,这显然不对;而且cur_sum初始为0,第一次循环直接加第一个元素,逻辑上也有点小问题。
  • cur_sum < 0时,清空cur_array的操作会影响之前赋值的max_subarray(因为引用的问题)。

接下来是修复后的代码,我给你标出来关键修改点:

def maxSubarray(self, nums):
    # 处理空数组的边界情况(可选,但更健壮)
    if not nums:
        return []
    
    cur_sum = nums[0]
    max_sum = nums[0]
    max_subarray = [nums[0]]
    cur_array = [nums[0]]
    
    for i in range(1, len(nums)):
        # 如果当前累加和加上当前元素还不如当前元素本身大,就重置cur_array和cur_sum
        if cur_sum + nums[i] < nums[i]:
            cur_sum = nums[i]
            cur_array = [nums[i]]
        else:
            cur_sum += nums[i]
            cur_array.append(nums[i])
        
        # 更新最大和子数组的时候,要做列表拷贝,创建独立的新列表
        if cur_sum > max_sum:
            max_sum = cur_sum
            # 这里用copy()或者list(cur_array)都可以,生成新列表
            max_subarray = cur_array.copy()
    
    return max_subarray

咱们来验证一下你的测试用例:输入[-2,1,-3,4,-1,2,1,-5,4],这段代码会正确返回[4,-1,2,1]

再给你解释几个关键修改:

  1. 列表拷贝:当更新max_subarray时,用cur_array.copy()创建了一个新的列表,这样后续修改cur_array就不会影响到max_subarray了。
  2. 初始值修正:把cur_summax_sumcur_arraymax_subarray都初始化为第一个元素,这样能正确处理全负数的情况。
  3. 重置逻辑优化:当当前累加和加上当前元素反而比当前元素小的时候,直接重置cur_arraycur_sum为当前元素,这符合Kadane算法的核心思想——如果前面的累加是负的,不如直接从当前元素重新开始。

你可以把这段代码跑一下你的测试用例,应该就能得到正确结果啦!

备注:内容来源于stack exchange,提问作者Alvin666

火山引擎 最新活动