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」的要求。
你每次都覆盖旧下标,就会导致原本足够的下标差被缩短。以该测试用例为例:
- i=0时,sum=5,mod=2,哈希表存入
{2:0} - i=1时,sum=5,mod=2,此时下标差为1-0=1,不满足要求,但你直接把
2对应的下标更新为1 - i=2时,sum=5,mod=2,此时下标差为2-1=1,还是不满足要求,你又把
2对应的下标更新为2 - 全程都不会触发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
相关产品推荐
相关产品推荐

