560. 和为 K 的子数组(java)
个人理解:前缀和+哈希表的应用
首先,要求的是连续的子数组,故可以想到前缀和数组:sum[i]-sum[j]=k 那么[i,j]就是一个子数组
sum[i]表示 [0-i] 的和,对于前缀和数组,sum[0]=0 ;前缀和数组长度为原数组长度+1
变换后:sum[j]=sum[i]-k 寻找等于k的数组,等价于寻找sum[j]的个数。所以可以用哈希表来记录sum[j]出现的次数。
class Solution {public int subarraySum(int[] nums, int k) {// 计算前缀和Map<Integer,Integer> hs =new HashMap<>(); // 用哈希集合保存前缀和出现的次数int count=0;int lenN=nums.length;int[] preSum=new int[lenN+1]; // 创建数组保存前缀和preSum[0]=0;int i =1;// 计算得到前缀和数组for(int num:nums){preSum[i]=preSum[i-1]+num;i++;}// 遍历前缀和数组for(int num:preSum){if(hs.containsKey(num-k)){ // preSum[i]-preSum[j]=k 说明当前num是符合的count+=hs.get(num-k); // 获取键对应的值}hs.put(num,hs.getOrDefault(num,0)+1); // 获取num键的值,没有则返回0。存入的是当前num的数量}return count;}
}