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;
    }
}
相关推荐
知识分享小能手1 小时前
高等数学学习教程,从入门到精通,定积分 — 知识点全面总结(10)
学习·机器学习·概率论
蓝斯4977 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加贝塞尔曲线,上、下、左、右连接点
java·c#·流程图
前端工作日常7 小时前
我学习到的Java 的 Service 分层:itf 和 impl 到底是什么?
java·后端
都叫我大帅哥8 小时前
Spring @Transactional 注解完全指南
java·spring
Java成神之路-8 小时前
G1 垃圾回收器 :SATB + TAMS核心机制深度解析
java·jvm
暗影凋落8 小时前
CMake构建学习笔记-SQLite库的构建
笔记·学习·sqlite
前端工作日常8 小时前
我学习到的JIT即时编译与机器码缓存失效
java·后端
带刺的坐椅9 小时前
Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎
java·solon·jetty·undertow·mcp-server·htttp
luj_17689 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
画面无声9 小时前
STM32的SPI通信原理与练习记录
c语言·stm32·单片机·嵌入式硬件·学习