LeetCode560. 和为 K 的子数组(2024秋季每日一题 12)

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

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

示例 1:

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

输出:2

示例 2:

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

输出:2

提示:

1 < = n u m s . l e n g t h < = 2 ∗ 1 0 4 1 <= nums.length <= 2 * 10^4 1<=nums.length<=2∗104
− 1000 < = n u m s [ i ] < = 1000 -1000 <= nums[i] <= 1000 −1000<=nums[i]<=1000
− 1 0 7 < = k < = 1 0 7 -10^7 <= k <= 10^7 −107<=k<=107


思路:前缀和 + 哈希表

  • 先遍历一遍数组求出前缀和(为了防止越界检查,下标从 1 开始)
  • 对于前缀和,当 [i+1~j] 这个区间的和为 k 时,则有 s[j] - s[i]=k
  • 所以 求多少个 区间和为 k,就转换成了求有多少个(i,j)(j > i) s[j] - s[i]= k
  • 如果暴力枚举(i,j)的话,需要 O ( N 2 ) O(N^2) O(N2) 的时间复杂度,可以考虑通过哈希表优化
  • 在哈希表中存储 s[x] 出现的个数,当遍历到当前元素时,只需要判断 (s[j] - k) 在哈希表是否存在,存在的话,在答案 res 上加上(s[j] - k)出现的次数(因为如果, s[j] - k 在 hash表中存在,那说明至少有一个 s[i] 满足,s[j] - s[i] == k,而s[j] - k 出现的次数,就是 对于当前 j,有多少个 i 满足,[i~j] 区间的和为 k)

时间复杂度: O ( N ) O(N) O(N)

cpp 复制代码
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        vector<int> s(nums.size() + 1, 0);
        for(int i = 1; i <= nums.size(); i++) s[i] += (s[i-1] + nums[i-1]);
        unordered_map<int, int> h;
        int res = 0;
        for(int i = 0; i <= nums.size(); i++){
            if(h.count(s[i] - k)) res += h[s[i] - k];
            h[s[i]] ++;
        }
        return res;
    }
};
相关推荐
大写的z先生2 分钟前
【深度学习 | 论文精读】
深度学习·算法·语言模型
大肥羊学校懒羊羊2 分钟前
质因数个数问题:高效分解算法详解
开发语言·c++·算法
米粒15 分钟前
力扣算法刷题Day 49(接雨水)
算法·leetcode·职场和发展
探物 AI9 分钟前
【感知实战·数据增强篇】深度解析目标检测中的图片数据增强算法,多图演示效果
人工智能·算法·目标检测
Evand J17 分钟前
【MATLAB代码介绍】三维环境下的IMM(交互式多模型),使用CV和CT模型,EKF作为滤波,目标高精度、自适应跟踪定位
开发语言·算法·matlab·imm·代码介绍
网安INF21 分钟前
数据结构第四章复习:树与二叉树
数据结构
ZC跨境爬虫21 分钟前
3D 地球卫星轨道可视化平台开发 Day12(解决初始相位拥挤问题,实现卫星均匀散开渲染)
前端·javascript·算法·3d·json
子午27 分钟前
蔬菜识别~Python+深度学习+卷积网络算法+图像识别+2026原创+蔬菜识别
python·深度学习·算法
6Hzlia28 分钟前
【Hot 100 刷题计划】 LeetCode 155. 最小栈 | C++ 打包状态法 (最优雅的 O(1) 检索)
java·c++·leetcode
子午29 分钟前
文本情感识别系统~Python+textCNN算法+深度学习+人工智能
人工智能·python·算法