LeetCode - 974. Subarray Sums Divisible by K
Medium
這題可以連著 523. Continuous Subarray Sum 寫,思路很像
974. Subarray Sums Divisible by K題目
Given an integer array nums and an integer k, return the number of non-empty subarrays that have a sum divisible by k.
A subarray is a contiguous part of an array.
Example 1:
Input: nums = [4,5,0,-2,-3,1], k = 5
Output: 7
Explanation: There are 7 subarrays with a sum divisible by k = 5:[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]
Example 2:
Input: nums = [5], k = 9
Output: 0
Constraints:
<= nums.length <=<= nums[i] <=2 <= k <= 10^4
解題思路
[4, 5, 0, -2, -3, 1]
prefixSum:[4, 9, 9, 7, 4, 5]
prefixSum mod:[4, 4, 4, 2, 4, 0]
for i = 0, nums[i] = 4, prefixSum mod = 4, [4], modSeen[4] = 1
for i = 1, nums[i] = 5, prefixSum mod = 4, [4, 4], ans += modSeen[4], modSeen[4]++ = 2
代表有第一個 prefixSum mod = 4 後的 [5] 5 可以被 5 整除
for i = 2, nums[i] = 0, prefixSum mod = 4, [4, 4, 4], ans += modSeen[4], modSeen[4]++ = 3
代表有第一個 4 後的 [5, 0] 5 + 0 可以被 5 整除,以及第二個 4 後的 [0] 可以被 5 整除
(ans + (modSeen[4] = 2 代表前面有兩個餘 4 的 prefixMod 可以組合,所以加 2))
for i = 3, nums[i] = -2, prefixSum mod = 2, [4, 4, 4, 2], modSeen[2] = 1
for i = 4, nums[i] = -3, prefixSum mod = 4, [4, 4, 4, 2, 4], modSeen[4]++ = 4
代表有第一個 4 後的 [5, 0, -2, -3] 5 + 0 + -2 + -3 可以被 5 整除,以及第二個 4 後的 [0, -2, -3] 5 + 0 + -2 + -3 可以被 5 整除,還有第三個 4 後的 [-2, -3] -2 + -3 可以被 5 整除
for i = 5, nums[i] = 1, prefixSum mod = 0, [4, 4, 4, 2, 4, 0], modSeen[0]++ = 2
代表有第一個 0 後的 [4, 5, 0, -2, -3, 1] 可以被 5 整除
Solution Code
1 | class Solution { |