其他分享
首页 > 其他分享> > 力扣 - 560. 和为K的子数组

力扣 - 560. 和为K的子数组

作者:互联网

目录

题目

560. 和为K的子数组

思路1(前缀和)

代码

class Solution {
    public int subarraySum(int[] nums, int k) {
        int[] prefixSum = new int[nums.length+1];

        for (int i = 0; i < nums.length; i++) {
            prefixSum[i+1] = prefixSum[i] + nums[i];
        }

        int res = 0;
        for (int i = 1; i <= nums.length; i++) {
            for (int j = 0; j < i; j++) {
                if (prefixSum[i] - prefixSum[j] == k) {
                    res++;
                }
            }
        }
        return res;
    }
}

复杂度分析

思路2(前缀和+哈希表优化)

代码

class Solution {
    public int subarraySum(int[] nums, int k) {
        HashMap<Integer, Integer> prefixSum = new HashMap<>();
        prefixSum.put(0, 1);
        int sumI = 0;
        int res = 0;

        for (int i = 0; i < nums.length; i++) {
            sumI += nums[i];
            // 当前的前缀和(即从0...i)的值减去k,得到的值就是j..i区间的前缀和的值
            int sumJ = sumI - k;
            // 要查找的前缀和看看是否有存在,如果存在说明符合条件,就添加到res中
            if (prefixSum.containsKey(sumJ)) {
                res += prefixSum.get(sumJ);
            }
            // 每次把前缀和的及其出现的次数添加道哈希表中,如果不存在,就初始化为1,存在的话就加1即可
            prefixSum.put(sumI, prefixSum.getOrDefault(sumI, 0) + 1);
        }

        return res;
    }
}

复杂度分析

标签:前缀,nums,560,res,复杂度,prefixSum,力扣,int,数组
来源: https://www.cnblogs.com/linzedian/p/14118474.html