package leecode;
/**
* 剑指 Offer II 010. 和为 k 的子数组
*
* 给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。
*
* @author Tang
* @date 2021/10/28
*/
public class SubarraySum {
/**
* 利用前缀数组
(前缀和主要适用的场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和。)
* 构建一个备忘录dp, dp[n]的值为从nums[0]加到nums[n]
*
*
* @param nums
* @param k
* @return
*/
public int subarraySum(int[] nums, int k) {
int[] dpTables = new int[nums.length];
int temp = 0;
for(int i = 0; i < nums.length; i++) {
temp += nums[i];
dpTables[i] = temp;
}
int count = 0;
//以元素i为首的子数组中是否存在和为k (dpTables[j] - dpTables[i-1])
//如果存在count++
for(int i = 0; i < nums.length; i++) {
for(int j = i; j < nums.length; j++) {
int sum = i == 0 ? dpTables[j] : dpTables[j] - dpTables[i - 1];
if(sum == k) {
count++;
}
}
}
return count;
}
public static void main(String[] args) {
int[] nums = {1,1,1};
System.out.println(new SubarraySum().subarraySum(nums, 2));
}
}