目录
- [1- 思路](#1- 思路)
- [2- 实现](#2- 实现)
-
- [⭐560. 和为 K 的子数组------题解思路](#⭐560. 和为 K 的子数组——题解思路)
- [3- ACM 实现](#3- ACM 实现)
- 原题链接:560. 和为 K 的子数组
1- 思路
前缀和
- ① 借助
HashMap
存储前缀和:Key
为对应的前缀和,Value
为对应的出现次数hm
初始化放入(0,1)
代表和为0
的情况出现1
次
- ② 定义
pre
求解前缀和 - ③ 遍历数组
问题转换
- 利用前缀和的特性,求
[i..j]
中的元素和,相当于数组和- 想要求
[j..i]
区间的和相当于利用prefixSum[i] - prefixSum[j-1] = k
- 移项可得,满足
prefixSum[i] - k = prefixSum[j-1]
即可
- 想要求
- 已有:
k
和prefixSum[i]
------> 求是否存在prefixSum[j-1]
,存在即可加上该值
2- 实现
⭐560. 和为 K 的子数组------题解思路
java
class Solution {
public int subarraySum(int[] nums, int k) {
HashMap<Integer,Integer> map = new HashMap<>();
map.put(0,1);
int res = 0;
int prefixSum=0;
for(int num:nums){
prefixSum += num;
if(map.containsKey(prefixSum-k)){
res += map.get(prefixSum-k);
}
map.put(prefixSum,map.getOrDefault(prefixSum,0)+1);
}
return res;
}
}
3- ACM 实现
java
public class subArrayLength {
public static int subLen(int[] nums,int k){
//1.数据结构
HashMap<Integer,Integer> hm = new HashMap<>();
int res = 0;
int prefixSum = 0;
hm.put(0,1);
for(int num:nums){
prefixSum+=num;
if(hm.containsKey(prefixSum-k)){
res+=hm.get(prefixSum-k);
}
hm.put(prefixSum,hm.getOrDefault(prefixSum,0)+1);
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入数组长度");
int n = sc.nextInt();
int[] nums = new int[n];
for(int i = 0 ; i < n ;i++){
nums[i] = sc.nextInt();
}
System.out.println("输入k");
int k = sc.nextInt();
System.out.println("结果是"+subLen(nums,k));
}
}