字串-560. 和为 K 的子数组
文章目录1.题解核心原理前缀和 哈希表2.机考代码3.知识点讲解力扣地址 中等560. 和为 K 的子数组1.题解核心原理前缀和 哈希表前缀和定义pre[j]表示数组从第 1 个元素到第 j 个元素的总和。子数组[i1, j]的和 pre[j] - pre[i]。问题转化我们要找满足pre[j] - pre[i] k的(i,j)对等价于找pre[i] pre[j] - k的前缀和出现次数。哈希表作用用HashMap存储前缀和 → 出现次数的映射遍历数组时实时查询pre[j]-k的出现次数累加到结果中再更新当前前缀和的计数。初始化关键map.put(0, 1)表示前缀和为 0 时出现 1 次对应子数组从数组开头到j的情况。classSolution{publicintsubarraySum(int[]nums,intk){intres0;intcurSum0;MapInteger,IntegerpreSumMapnewHashMap();preSumMap.put(0,1);for(intnum:nums){curSumnum;if(preSumMap.containsKey(curSum-k))respreSumMap.get(curSum-k);preSumMap.put(curSum,preSumMap.getOrDefault(curSum,0)1);}returnres;}}2.机考代码importjava.util.HashMap;importjava.util.Map;importjava.util.Scanner;publicclassMain{publicstaticintsubarraySum(int[]nums,intk){// 结果和为k的子数组个数intres0;// 当前前缀和intcurSum0;// 哈希表key前缀和value该前缀和出现的次数MapInteger,IntegerpreSumMapnewHashMap();// 初始化前缀和为0的情况出现1次处理子数组从开头到当前位置的场景preSumMap.put(0,1);for(intnum:nums){// 累加当前元素得到当前前缀和curSumnum;// 查找是否存在前缀和 curSum - k存在则累加次数if(preSumMap.containsKey(curSum-k)){respreSumMap.get(curSum-k);}// 更新当前前缀和的出现次数preSumMap.put(curSum,preSumMap.getOrDefault(curSum,0)1);}returnres;}publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);// 读取数组长度intnsc.nextInt();int[]numsnewint[n];// 读取数组元素for(inti0;in;i){nums[i]sc.nextInt();}// 读取目标值intksc.nextInt();// 输出结果System.out.println(subarraySum(nums,k));}}3.知识点讲解