LeetCode《Subarray Sum Equals K》问题暴力解法异常:输出结果不符且内循环取值异常
问题排查:你的Subarray Sum Equals K暴力解法为什么输出错误?
让我们一步步拆解你代码里的问题,以及为什么会出现你看到的奇怪j取值和错误结果:
1. 内循环范围错误,导致漏掉关键子数组
你的内循环写的是range(i + 1, len(nums)),但Python的切片nums[i:j]是左闭右开的——也就是说,它包含索引i的元素,但不包含索引j的元素。在你的测试用例[1,1,1]中,正确的第二个子数组是从索引1到2的两个1,对应的切片应该是nums[1:3](因为索引3超出数组长度,会取到最后一个元素)。但你的内循环j最大只能到len(nums)-1=2,所以永远不会检查j=3的情况,自然漏掉了这个子数组。
2. 外循环范围没必要的限制
你写的range(len(nums) - 1)会让i只遍历到数组倒数第二个元素。虽然在这个测试用例里,最后一个元素作为起点的子数组([1])sum不等于2,不影响结果,但这是逻辑上的错误——子数组的起点可以是任意元素,包括最后一个。
3. 错误的break语句导致漏统计
在内循环里,你找到符合条件的子数组后就break,这会终止当前i的内循环,不再检查同一个起点下其他可能的终点。比如如果有数组[0,0,0]且k=0,每个i下都有多个j满足条件,break会让你只统计第一个,漏掉后续所有符合条件的子数组。
修正后的暴力解法代码
def subarraySum(nums, k: int) -> int: count = 0 # 遍历所有可能的起点,从第一个到最后一个元素 for i in range(len(nums)): # 遍历所有可能的终点,从i+1到数组长度(包含所有右边界) for j in range(i + 1, len(nums) + 1): if sum(nums[i:j]) == k: count += 1 # 移除break,继续检查后续可能的j return count print(subarraySum([1,1,1],2)) # 现在输出正确的2
关于你看到的j取值问题
你调试时看到j出现1、2、2,是因为:
- 当i=0时,内循环
range(1,3)生成j=1、2; - 当i=1时,内循环
range(2,3)生成j=2;
但由于j没到3,nums[1:2]的sum是1,不满足k=2,所以这个循环没增加count。修正j的范围到len(nums)+1后,i=1时j会取到3,nums[1:3]的sum是2,就会被统计到。
内容的提问来源于stack exchange,提问作者if fhhf
相关产品推荐
相关产品推荐

