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