LeetCode 53题扩展问题:最大和子数组返回代码的错误排查与修复咨询
LeetCode 53题扩展问题:最大和子数组返回代码的错误排查与修复咨询
嘿,我来帮你揪出这段代码里的问题,然后给你修复方案!
首先,你遇到的核心问题是列表的引用赋值导致的同步修改。咱们来拆解一下:
当你执行max_subarray = cur_array的时候,并没有生成一个新的独立列表,而是让max_subarray和cur_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]。
再给你解释几个关键修改:
- 列表拷贝:当更新
max_subarray时,用cur_array.copy()创建了一个新的列表,这样后续修改cur_array就不会影响到max_subarray了。 - 初始值修正:把
cur_sum、max_sum、cur_array、max_subarray都初始化为第一个元素,这样能正确处理全负数的情况。 - 重置逻辑优化:当当前累加和加上当前元素反而比当前元素小的时候,直接重置
cur_array和cur_sum为当前元素,这符合Kadane算法的核心思想——如果前面的累加是负的,不如直接从当前元素重新开始。
你可以把这段代码跑一下你的测试用例,应该就能得到正确结果啦!
备注:内容来源于stack exchange,提问作者Alvin666




