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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:18:14