和为 k 的子数组

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));

}
}
posted @ 2021-10-28 13:58  六小扛把子  阅读(127)  评论(0编辑  收藏  举报