给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:

    子数组大小 至少为 2 ,且
    子数组元素总和为 k 的倍数。
    如果存在,返回 true ;否则,返回 false 。

    如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。0 始终视为 k 的一个倍数。
    示例 1:

    输入:nums = [23,2,4,6,7], k = 6
    输出:true
    解释:[2,4] 是一个大小为 2 的子数组,并且和为 6 。
    示例 2:

    输入:nums = [23,2,6,4,7], k = 6
    输出:true
    解释:[23, 2, 6, 4, 7] 是大小为 5 的子数组,并且和为 42 。
    42 是 6 的倍数,因为 42 = 7 * 6 且 7 是一个整数。
    示例 3:

    输入:nums = [23,2,6,4,7], k = 13
    输出:false

    1. /**
    2. * @param {number[]} nums
    3. * @param {number} k
    4. * @return {boolean}
    5. */
    6. var checkSubarraySum = function (nums, k) {
    7. let len = nums.length;
    8. if (len < 2) return false;
    9. let map = new Map();
    10. // 规定空的前缀的结束下标为 −1,由于空的前缀的元素和为 0,因此在哈希表中存入键值对 (0,-1)
    11. map.set(0, -1);
    12. let remainder = 0;
    13. for (let i = 0; i < len; i += 1) {
    14. // 取余数
    15. remainder = (remainder + nums[i]) % k;
    16. if (map.has(remainder)) {
    17. const prevIndex = map.get(remainder);
    18. // 数组大小至少为2
    19. if (i - prevIndex >= 2) {
    20. return true;
    21. }
    22. } else {
    23. map.set(remainder, i);
    24. }
    25. }
    26. return false;
    27. };

    image.png