给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
思路:
sum
: 当前位置的累积和。
如果以当前位置为结尾的数组中,存在和为k的子数组,那么,一定存在更短的子数组和为sum - k。
使用一个循环遍历数组 nums
。
a. 在每次循环中,更新 sum
为当前位置的累积和,即 sum += nums[i]
。
b. 检查 counts
中是否存在 sum - k
,如果存在,将对应的频次加到 ans 中。
c. 将当前位置的累积和 sum
添加到 counts
中,并更新其频次。
public class Solution {public int SubarraySum(int[] nums, int k) {int ans = 0;IDictionary<int, int> counts = new Dictionary<int, int>();counts.Add(0, 1);int sum = 0;for(int i = 0;i < nums.Length; i++){sum += nums[i];int count = counts.ContainsKey(sum - k) ? counts[sum - k] : 0;ans += count;counts.TryAdd(sum,0);counts[sum]++;}return ans;}
}