LeetCode热题100--560.和为K的子数组(前缀和)--中等

1.题目

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

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

示例 1:

输入:nums = 1,1,1, k = 2

输出:2

示例 2:

输入:nums = 1,2,3, k = 3

输出:2

2. 题解

java 复制代码
class Solution {
    public int subarraySum(int[] nums, int k) {
        int n = nums.length;
        int[] s = new int[n+1];
        for(int i = 0; i < n; i++){
            s[i+1] = s[i] + nums[i];
        }

        int ans = 0;
        Map<Integer,Integer> cnt = new HashMap<>(n+1);
        for (int sj : s){
            ans += cnt.getOrDefault(sj - k, 0);
            cnt.merge(sj, 1, Integer::sum);
        }
        return ans;
    }
}

3. 解析

出自这位老师:灵茶山艾府:前缀和+哈希表:从两次遍历到一次遍历,附变形题(Python/Java/C++/Go/JS/Rust)

第1部分:初始化变量和前缀和数组

java 复制代码
int n = nums.length;
int[] s = new int[n+1];
  • int n = nums.length;:获取输入数组nums的长度,赋值给n。
  • int\[\] s = new intn+1;:创建一个长度为n+1的前缀和数组s。前缀和数组用于存储从数组开头到当前位置的累加和。

第2部分:填充前缀和数组

java 复制代码
for(int i = 0; i < n; i++){
    s[i+1] = s[i] + nums[i];
}
  • 使用一个循环从i=0遍历到nums.length-1,计算前缀和。
  • s0初始化为0,表示前缀和数组的第一个元素是0。
  • 对于每个索引i(0 ≤ i < n),将当前nums的值加到si+1中。这样,si+1就记录了从nums0到numsi的累加和。

第3部分:初始化答案变量

java 复制代码
int ans = 0;
  • int ans = 0;:用于累计符合条件子数组的数量。

第4部分:创建哈希表并初始化

java 复制代码
Map<Integer,Integer> cnt = new HashMap<>(n+1);
  • 创建一个容量为n+1的HashMap,键值类型是Integer。
  • hashmap的作用是统计每个前缀和出现的次数。这里预先分配了n+1个空间。

第5部分:遍历前缀和数组

java 复制代码
for (int sj : s){
    ans += cnt.getOrDefault(sj - k, 0);
    cnt.merge(sj, 1, Integer::sum);
}
  • 遍历s数组中的每一个元素sj。
  • 对于每个sj,首先查找键值对(sj - k)在map中出现的次数,并将这个次数加到ans中。这一步的作用是找到所有以当前前缀和sj为结尾且子数组和等于k的子数组数量。
  • 然后更新哈希表cnt:将键sj的出现次数增加1。

第6部分:返回答案

java 复制代码
return ans;

最终返回累计的符合条件子数组的数量ans。

相关推荐
phltxy14 小时前
C语言操作符详解
java·c语言·算法
aqiu11111115 小时前
【LeetCode 902】最大为 N 的数字组合 - 详细题解与数位组合思路
数据结构·算法·leetcode·蓝桥杯·数位dp
辰烨chenye16 小时前
LeetCode Hot 100 题解 · 哈希篇
算法·leetcode·哈希算法
罗西的思考16 小时前
DreamZero 与 DreamDojo:世界模型与策略的分层协同综合分析与对比
人工智能·算法·机器学习
玖玥拾17 小时前
LeetCode 219 存在重复元素 II
算法·leetcode·哈希算法·散列表
知无不研18 小时前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
a1879272183119 小时前
【算法】动态规划第四篇:背包收官——min 哨兵、计数世界与组合排列分水岭
算法·leetcode·动态规划·dp·01背包·算法讲解·决策合并
2601_9622974819 小时前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
辰烨chenye19 小时前
LeetCode Hot 100 题解 · 子串篇
算法·leetcode·职场和发展