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

LeetCode连续子数组和测试用例nums=[5,0,0,0]k=3返回true原因求解

问题解答

你遗漏的判定规则

  • 0 可以被任意非零整数整除,本题中k=3≠0,因此和为0的子数组天然满足「和可被k整除」的要求
  • 该测试用例存在大量符合要求的子数组:比如下标1到2的两个0组成的子数组,和为0,长度为2,完全满足题目要求,因此预期输出为True是正确的。

你代码的逻辑缺陷

你的代码运行该测试用例会错误返回False,核心问题是哈希表的更新逻辑错误:

// 你当前的逻辑是无论mod是否存在,都更新为最新的下标
map.put(mod, i);

前缀和取模的核心逻辑是:同一个余数最早出现的下标才有用,保留最早下标才能保证后续再次遇到相同余数时,两个下标之差尽可能大,更容易满足「长度≥2」的要求。
你每次都覆盖旧下标,就会导致原本足够的下标差被缩短。以该测试用例为例:

  1. i=0时,sum=5,mod=2,哈希表存入{2:0}
  2. i=1时,sum=5,mod=2,此时下标差为1-0=1,不满足要求,但你直接把2对应的下标更新为1
  3. i=2时,sum=5,mod=2,此时下标差为2-1=1,还是不满足要求,你又把2对应的下标更新为2
  4. 全程都不会触发True的判断,最终错误返回False

修正方案

仅当mod不存在于哈希表中时,才存入当前下标,也可以提前存入(0,-1)合并mod为0的判断逻辑:

class Solution { 
    public boolean checkSubarraySum(int[] nums, int k) { 
        int sum = 0; 
        int mod = 0; 
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, -1);
        for(int i =0; i<nums.length; i++) { 
            sum += nums[i]; 
            mod = sum % k; 
            if(map.containsKey(mod)) {
                if(i - map.get(mod) > 1) {
                    return true;
                }
            } else {
                map.put(mod, i); 
            }
        } 
        return false; 
    } 
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:06:02