Brute force solution


class Solution:
    def checkSubarraySum(self, nums: List[int], k: int) -> bool:
        # time O(N^2) space O(N)
        # step1: initialize remainder: idx
        # edge case: when [0], k = 0 
        size = len(nums)
        # edge case
        if size < 2: return False 
        psum = [0] * size 
        psum[0] = nums[0]
        
        # get presum 
        for i in range(1,size):
            psum[i] = psum[i-1] + nums[i]
            
        # nums[i:j+1]    j - i >= 1 
        for i in range(size-1):
            for j in range(i+1,size):
                # num[i+1] + num[i+2] + .. +num[j]
                summ = psum[j] - psum[i] + nums[i] 
                if summ == k or (k != 0 and summ %k == 0):
                    return True
        return False 

optimization HashMap solution

class Solution:
    def checkSubarraySum(self, A: List[int], k: int) -> bool:
        # time O(N) space O(min(k,,N))
        # step1: initialize remainder: idx
        # edge case: when [0], k = 0 
        d = {0:-1}
        psum = 0 
        for i,a in enumerate(A):
            psum  += a 
            if k != 0: 
                psum = psum % k

            if psum in d:
                if(i-d[psum])> 1: # i - (j+1) >= 1  => i-j >= 2    
                    return True
            else: # only update d with current idx when psum not in  
                d[psum] = i
        return False