523. Continuous Subarray Sum

Given a list of non-negative numbers and a target integer k, write a function to check if the array has a continuous subarray of size at least 2 that sums up to the multiple of k, that is, sums up to n*k where n is also an integer.

Example 1:

Input: [23, 2, 4, 6, 7],  k=6

Output: True

Explanation: Because [2, 4] is a continuous subarray of size 2 and sums up to 6.

Example 2:

Input: [23, 2, 6, 4, 7],  k=6

Output:True

Explanation: Because [23, 2, 6, 4, 7] is an continuous subarray of size 5 and sums up to 42.

Note:

  1. The length of the array won't exceed 10,000.
  2. You may assume the sum of all the numbers is in the range of a signed 32-bit integer.

Thoughts:

  1. Use map:
    1. Query whether there is a index with value equal to modulo preSum and whether its distance from current i is > 1
    2. Use end<modulo preSum: index> to record the modulo preSum value
  2. Use only set + add delay
class Solution(object):
    def checkSubarraySum(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        preS, end = 0, {0: -1}

        for i, num in enumerate(nums):
            preS += num
            if k != 0:
                preS %= k 
            if preS in end: # keep the least index
                if i - end[preS] > 1:
                    return True
            else: 
                end[preS] = i 

        return False
class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        int n = nums.size(), sum = 0, pre = 0;
        unordered_set<int> modk;
        for(int i = 0; i < n; i++){
            sum += nums[i];
            int mod =  k == 0 ? sum : sum % k;
            if(modk.count(mod)) return true;
            modk.insert(pre);
            pre = mod; // delay for two loops
        }
        return false;
    }

};

Python

class Solution(object):
    def checkSubarraySum(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        n, s, pre = len(nums), 0, 0
        end = set()

        for i, num in enumerate(nums):
            s += num
            if k != 0:
                s %= k

            if s in end: return True
            end.add(pre)
            pre = s 

        return False

results matching ""

    No results matching ""