专业的企业网站优化公司,wordpress 安装 空白页,做目录右内容网站,中国兰州网官网题目链接 Leetcode.560 和为 K 的子数组 mid 题目描述
给你一个整数数组 n u m s nums nums 和一个整数 k k k #xff0c;请你统计并返回 该数组中和为 k k k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1#xff1a; 输入#xff1a;nums [1,1,1]…题目链接 Leetcode.560 和为 K 的子数组 mid 题目描述
给你一个整数数组 n u m s nums nums 和一个整数 k k k 请你统计并返回 该数组中和为 k k k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1 输入nums [1,1,1], k 2 输出2 示例 2 输入nums [1,2,3], k 3 输出2 提示 1 ≤ n u m s . l e n g t h ≤ 2 ∗ 1 0 4 1 \leq nums.length \leq 2 * 10^4 1≤nums.length≤2∗104 − 1000 ≤ n u m s [ i ] ≤ 1000 -1000 \leq nums[i] \leq 1000 −1000≤nums[i]≤1000 − 1 0 7 ≤ k ≤ 1 0 7 -10^7 \leq k \leq 10^7 −107≤k≤107
解法前缀和 哈希表
我们假设 [ j , i ] [j,i] [j,i] 区间的子数组元素和为 k k k即 : n u m s [ j ] n u m s [ j 1 ] . . . n u m s [ i − 1 ] n u m s [ i ] k nums[j] nums[j 1] ... nums[i-1] nums[i] k nums[j]nums[j1]...nums[i−1]nums[i]k
我们用 s u m sum sum 表示 n u m s nums nums 的前缀和数组可将上式转换为 s u m [ i ] − s u m [ j − 1 ] k sum[i] - sum[j-1] k sum[i]−sum[j−1]k
再转换一下得到 s u m [ j − 1 ] s u m [ i ] − k sum[j-1] sum[i] - k sum[j−1]sum[i]−k
那么以 n u m s [ i ] nums[i] nums[i] 为结尾的数组我们只需要统计前面等于 s u m [ j − 1 ] sum[j-1] sum[j−1] 也就是 s u m [ i ] − k sum[i] - k sum[i]−k的前缀和的数量 t t t 即可。
那么这个 t t t 就是以 n u m s [ i ] nums[i] nums[i] 为结尾的数组中 和为 k k k 的子数组的数量。
我们只需要对每一个 n u m s [ i ] nums[i] nums[i] 都加上 t t t 即可这样我们就可以统计出所有的 和为 k k k 的子数组的数量。
在实现上我们使用哈希表来记录前缀和出现的次数。初始时和为 0 0 0 也需要统计它的出现次数即 { 0 , 1 } \{ 0 , 1 \} {0,1}。
时间复杂度 O ( n ) O(n) O(n)
C代码
class Solution {
public:int subarraySum(vectorint nums, int k) {int n nums.size() , ans 0 , sum 0;unordered_mapint,int cnt;cnt[0] 1;for(int i 0;i n;i){sum nums[i];ans cnt[sum - k];cnt[sum];}return ans;}
};