我在 Leetcode 上遇到了这个问题我看到了解决方案,但我无法理解它为什么起作用。它适用于模量的什么性质?我们怎么能说我们找到了一个总和等于 k 的子数组,仅仅通过查看模结果的前一次出现?
题:
给定一个非负数列表和一个目标整数 k,编写一个函数来检查该数组是否有一个大小至少为 2 的连续子数组,其总和为 k 的倍数,即总和为 n*k,其中n 也是一个整数。
示例 1:输入:[23, 2, 4, 6, 7], k=6 输出:True 解释:因为 [2, 4] 是大小为 2 的连续子数组,总和为 6。
解决方案:
public boolean checkSubarraySum(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>(){{put(0,-1);}};;
int runningSum = 0;
for (int i=0;i<nums.length;i++) {
runningSum += nums[i];
if (k != 0) runningSum %= k;
Integer prev = map.get(runningSum);
if (prev != null) {
if (i - prev > 1) return true; …Run Code Online (Sandbox Code Playgroud)