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:
- The length of the array won‘t exceed 10,000.
- You may assume the sum of all the numbers is in the range of a signed 32-bit integer.
1 public class Solution { 2 // idea: https://discuss.leetcode.com/topic/80793/java-o-n-time-o-k-space 3 public bool CheckSubarraySum(int[] nums, int k) { 4 var dict = new Dictionary<int, int>(); 5 dict[0] = -1; 6 var sum = 0; 7 8 for (int i = 0; i < nums.Length; i++) 9 { 10 sum += nums[i]; 11 12 var prev = k == 0 ? sum : sum % k; 13 14 if (dict.ContainsKey(prev)) 15 { 16 if (i - dict[prev] > 1) return true; 17 } 18 else 19 { 20 dict[prev] = i; 21 } 22 } 23 24 return false; 25 } 26 }