其他分享
首页 > 其他分享> > leetcode560. 和为 K 的子数组(mid)

leetcode560. 和为 K 的子数组(mid)

作者:互联网

和为 K 的子数组


力扣链接

题目描述

给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2

提示:

解题思路

官方题解链接

代码(枚举)

class Solution {
    public int subarraySum(int[] nums, int k) {
        //数组长度
        int n = nums.length;

        //满足条件的个数
        int count = 0;
        for (int i = 0; i < n; ++i) {
            int sum = 0;
            for (int j = i; j < n; ++j) {
                sum += nums[j];
                if (sum == k) {
                    ++count;
                }
            }
        }
        return count;
    }
}

复杂度

代码(前缀和+哈希表优化)

//前缀和+hash表优化
    public int subarraySum(int[] nums, int k) {
        //满足条件的个数
        int count = 0;
        //前缀和
        int pre = 0;
        HashMap< Integer, Integer > map = new HashMap <>();
        //应对有连续的多个值刚好和为k的情况
        map.put(0, 1);
        for (int i = 0; i < nums.length; i++) {
            pre += nums[i];
            //如果有前缀和为pre-k的,说明就有map.get(pre-k)个满足条件的连续子数组的和为k
            if (map.containsKey(pre - k)) {
                count += map.get(pre - k);
            }
            //添加前缀和pre -> 前缀和为pre个数的映射
            map.put(pre, map.getOrDefault(pre, 0) + 1);
        }
        return count;
    }

复杂度

在这里插入图片描述

标签:pre,map,leetcode560,前缀,nums,int,复杂度,mid,数组
来源: https://blog.csdn.net/qq_43478625/article/details/121997764