和为K的子数组

101 阅读1分钟

题目

前缀和

    public int subarraySum(int[] nums, int k) {

        // 利用前缀和计算
        // dp[i] = nums[0] + nums[1] + ... + nums[i]
        int [] dp = new int[nums.length];
        for (int i = 0; i < nums.length; i ++) {
            if (i == 0) {
                dp[i] = nums[0];
            } else {
                dp[i] = dp[i - 1] + nums[i];
            }
        }

        Map<Integer, Integer> record = new HashMap<>();
        // 题目可转化为 dp[j] - dp[i] + nums[i] == k
        // 目标为寻求dp[j] = k + dp[i] - nums[i]
        int count = 0;
        for (int i = 0; i < nums.length; i ++) {
            record.put(k + dp[i] - nums[i], record.getOrDefault(k + dp[i] - nums[i], 0) + 1);
            count += record.getOrDefault(dp[i], 0);
        }


        return count;

    }

基本思路

  1. 因为数组中元素可正, 可负, 因此通过前缀和来计算,

  2. 在map中添加元素的时候, 先put, 再get, 来得到是不是i和j相等的情况