JAVA练习278- 和为 K 的子数组

题目概览

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

子数组是数组中元素的连续非空序列。

示例 1:

复制代码
输入:nums = [1,1,1], k = 2
输出:2

示例 2:

复制代码
输入:nums = [1,2,3], k = 3
输出:2

提示:

  • 1 <= nums.length <= 2 * 104
  • -1000 <= nums[i] <= 1000
  • -107 <= k <= 107

来源:560. 和为 K 的子数组 - 力扣(LeetCode)

解题分析

方法:前缀和 + 哈希

和为 k 的连续子数组可以看做一个大的连续数组 减去 前面小的一个连续数组,如:nums = 1,1,2, k = 3, 可以看做 1,1,2 减去 1,因此我们可以令当前索引为 i,0 到 i 的数字之和即 前缀和 为 pre i ,需要减去的前缀和为 pre j ,那么可以得到:pre i - pre j = k,转换一下就是 pre j = pre i - k,由于 j 一定小于 i,我们可以定义哈希map,遍历 nums 并存储前缀和即 pre j ,当有 pre i - k 在哈希map中时,记录个数即可。

时间复杂度:O(n)

空间复杂度:O(n)

java 复制代码
class Solution {
    public int subarraySum(int[] nums, int k) {
        int result = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);
        int sum = 0;
        for (int num: nums) {
            sum += num;
            if (map.containsKey(sum - k)) {
                result += map.get(sum - k);
            }
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }
        return result;
    }
}
相关推荐
I_belong_to_jesus4 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla5 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
Gary移动存储固件6 小时前
eMMC5.1协议中文学习讲解(6.6.17~6.6.22.4.6)
学习·ufs·emmc·nand·存储固件
budingxiaomoli6 小时前
Spring统一功能处理
java·后端·spring
一个天蝎座 白勺 程序猿6 小时前
别让收藏夹替你学习:我搭AI知识体系的完整方法,脚本直接拿去用
人工智能·学习·ai·ai学习
楚山之石7 小时前
【Nat Biomed Eng】Connectome 2.0 超高梯度扫描仪:500 mT/m 与 600 T/m/s 把活体人脑微观结构分辨推进到亚微米级
图像处理·学习·数据分析·mri
Flynn Liang8 小时前
可观测性与成本治理:一次对话的 17 个观测点
java·langchain·可观测性·micrometer·langchain4j·token 成本·llm 监控
金銀銅鐵8 小时前
带您看懂字节码指令(三):同一行加法,为什么有四种指令
java·jvm
坤坤子吖10 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习