0
点赞
收藏
分享

微信扫一扫

560. 和为 K 的子数组(前缀和解法)

蒸熟的土豆 2022-01-09 阅读 33

在这里插入图片描述

class Solution {

    //method 1
       public int subarraySum(int[] nums, int k) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int[] preSum = new int[nums.length + 1];//1、构造前缀和
        for (int i = 1; i <= nums.length; i++) {
            preSum[i] = preSum[i - 1] + nums[i - 1];
        }
        int res = 0;
        for (int i = 1; i <= nums.length; i++) {//2、穷举所有元素
            for (int j = 0; j < i; j++) {
                if (preSum[i] - preSum[j] == k) {//3、nums[j,...,i-1]的和
                    res++;
                }
            }
        }
        return res;
    }

   //method 2 优化后的方法,使用map替代preSum数组,因为map查找元素时间复杂度O(1)
    public int subarraySum(int[] nums, int k) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);
        int res = 0, preSum = 0;
        for (int i = 0; i < nums.length; i++) {
            preSum += nums[i];//记录前缀和
            if (map.containsKey(preSum - k)) {//有满足条件的前缀和
                res += map.get(preSum - k);
            }
            map.put(preSum, map.getOrDefault(preSum, 0) + 1);//更新满足提议的前缀和个数
        }
        return res;
    }
}


举报

相关推荐

0 条评论