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;
    }
}
相关推荐
Evand J几秒前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa
惊讶的猫8 分钟前
MCP-server
java
传奇开心果编程12 分钟前
【ArkUI进阶练中学】第12课:应用架构演进与遗留系统迁移
学习·ui·华为·harmonyos
我想我不够好。12 分钟前
装一个纯净的系统
学习
ZealSinger14 分钟前
Boot4升级PostConstruct不跑了
java·spring boot·spring·升级迁移
Code_Solitude28 分钟前
C语言:关于二维数组的作业总结
java·c语言·前端
Wang's Blog31 分钟前
Java 项目实战: 外卖平台优化-Nginx六种负载均衡策略对比与选型
java·nginx·负载均衡
Wang's Blog43 分钟前
Java 项目实战: 外卖平台优化-YApi接口管理平台与文档导入导出
java·开发语言·yapi
海绵宝宝转agent1 小时前
leetCode100算法开源笔记分享
笔记·算法
专业程序开发源1 小时前
django新闻推荐系统70655-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·django·课程设计