leetcode 974
974. 和可被 K 整除的子数组
哈希表(通过)
思路:
在方法一中我们利用前缀和数组来求解问题,对于子数组nums[i:j] (不包含下标j),其区间和为sum[j] - sum[i] (其中sum 为预处理得到的前缀和数组),
我们要判断的是(sum[j] - sum[i])%K 是否等于0。
根据modmod运算的性质,我们知道(sum[j] - sum[i])%K = =sum[j]%K−sum[i]%K。
故若想(sum[j] - sum[i])%K = 0 ,则必有sum[j]%K = sum[i]%K。
所有满足nums[i:j]nums[i:j]中元素之和可以被K整除的开始下标ii,必有sum[j]%K = sum[i]%Ksum[j]%K=sum[i]%K。我们以sum[i]%Ksum[i]%K作为键值统计其出现的频率,从而对于每个下标jj我们可以立即获得能和它组成满足要求的子数组的开始下标ii的数量。
算法:
生成前缀和数组的过程中,将key = sum[j]%kkey=sum[j]%k 出现的频率加入结果数组, 同时将 key = sum[j]%kkey=sum[j]%k的出现频率加11。
由于数组中有可能出现负数,我们需要将其加KK从而使其%K%K之后的值为正数。
作者:KLEA
链接:https://leetcode-cn.com/problems/subarray-sums-divisible-by-k/solution/he-ke-bei-kzheng-chu-de-zi-shu-zu-by-lenn123/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。