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 小时前
RocketMQ学习-Spring Boot消息实践
java·spring boot·rocketmq
Jerry2 小时前
LeetCode 347. 前 K 个高频元素
算法
碎光拾影2 小时前
CPU与MCU核心区别揭秘
单片机·学习·51单片机
Young Doro2 小时前
SAC 算法
线性代数·算法·机器学习
罗超驿2 小时前
2.算法效率的核心密码:时间复杂度和空间复杂度详解
java·数据结构·算法
:-)3 小时前
算法-堆排序
数据结构·算法·排序算法
栈溢出了3 小时前
Redis 分片集群与哈希槽笔记
java·redis·笔记·spring
遨游DATA3 小时前
Spring Boot 启动失败排查:如何区分多 Bean 冲突与清理阶段异常
java·spring boot·后端