GuilinDev

Lc0523

05 August 2008

523 Continuous Subarray Sum

找一个子数组,子数组的和是给定k的n倍 - 存前缀累积和

前缀和 + HashSet

具体的,使用 HashSet 来保存出现过的值。

让循环从 2 开始枚举右端点(根据题目要求,子数组长度至少为 2),每次将符合长度要求的位置的取余结果存入 HashSet。

如果枚举某个右端点 j 时发现存在某个左端点 i 符合要求,则返回 True。

时间复杂度:O(n)

空间复杂度:O(n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
    public boolean checkSubarraySum(int[] nums, int k) {
        int len = nums.length;
        int[] sum = new int[len + 1];
        for (int i = 1; i <= len; i++) {
            sum[i] = sum[i - 1] + nums[i - 1];
        }
        HashSet<Integer> set = new HashSet<>();
        for (int i = 2; i <= len; i++) {
            set.add(sum[i - 2] % k);
            if (set.contains(sum[i] % k)) {
                return true;
            }
        }
        return false;
    }
}