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.
Solution:
We maintains a running sum and a HashMap to store the sum and indices.
If we find sum % k is in the HashMap and the index of it is at least two hops away from the current index, we find such subarray.
The time complexity is O(n) and the space complexity is O(k),
Code:
public class Solution { public boolean checkSubarraySum(int[] nums, int k) { HashMap<Integer, Integer> map = new HashMap<>(); map.put(0, -1); int sum = 0; for (int i = 0; i < nums.length; i++) { sum += nums[i]; if (k != 0) { sum %= k; } if (map.containsKey(sum)) { if (i - map.get(sum) > 1) { return true; } } else { map.put(sum, i); } } return false; } }