【前缀和计算和+哈希表查找次数】Leetcode 560. 和为 K 的子数组

题目要求

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

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

示例 1

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

输出:2

示例 2

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

输出:2

提示

  • 1 <= nums.length <= 2 * 10^4
  • -1000 <= nums[i] <= 1000
  • -10^7 <= k <= 10^7

实际应用

金融数据分析

在股票或金融交易数据中,快速找到特定时间段内收益为特定值的交易窗口。

例如,识别连续几天内收益总和为某个目标值的交易窗口,帮助分析市场趋势。

实时数据监控

在实时数据流中,快速检测和响应特定的事件模式,如网络流量监控、服务器性能监控等。

例如,实时计算某段时间内的流量或负载是否达到预警阈值。

前缀和+哈希表优化

  • 思想 :通过计算前缀和并利用哈希表记录每个前缀和出现的次数,可以快速计算任意子数组的和。当前缀和为 sum 时,若 sum - k 存在于哈希表中,则表示存在以当前索引结尾的子数组和为 k
  • 时间复杂度 :遍历数组的时间复杂度为 O(n),中间利用哈希表查询删除的复杂度均为 O(1),因此总时间复杂度为 O(n)
cpp 复制代码
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

int subarraySum(vector<int> &nums, int k)
{
    unordered_map<int, int> mp;
    int sum = 0, res = 0;
    // mp[0]表示前缀和为0的子数组个数
    mp[0] = 1;
    for (int i = 0; i < nums.size(); i++)
    {
        // 计算当前前缀和
        sum += nums[i];
        // 如果存在前缀和为sum-k的子数组,那么当前子数组就是满足条件的子数组
        if (mp.find(sum - k) != mp.end())
        {
            res += mp[sum - k];
        }
        // 更新前缀和为sum的子数组个数
        mp[sum]++;
    }
    return res;
}

int main(){
    vector<int> nums = {1,1,1};
    cout<<subarraySum(nums,2)<<endl;
    return 0;
}

推荐一下

https://github.com/0voice

相关推荐
代码游侠3 分钟前
C语言核心概念复习——C语言基础阶段
linux·开发语言·c++·学习
㓗冽12 分钟前
60题之内难题分析
开发语言·c++·算法
大江东去浪淘尽千古风流人物13 分钟前
【VLN】VLN仿真与训练三要素 Dataset,Simulators,Benchmarks(2)
深度学习·算法·机器人·概率论·slam
rainbow688921 分钟前
C++开源库dxflib解析DXF文件实战
开发语言·c++·开源
John_ToDebug24 分钟前
Chromium安全架构深度解析:从悬空指针检测到内存安全防御体系
c++·chrome
D_evil__32 分钟前
【Effective Modern C++】第五章 右值引用、移动语义和完美转发:24. 区分万能引用和右值引用
c++
铉铉这波能秀41 分钟前
LeetCode Hot100数据结构背景知识之字典(Dictionary)Python2026新版
数据结构·python·算法·leetcode·字典·dictionary
蜡笔小马1 小时前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
我是咸鱼不闲呀1 小时前
力扣Hot100系列20(Java)——[动态规划]总结(下)( 单词拆分,最大递增子序列,乘积最大子数组 ,分割等和子集,最长有效括号)
java·leetcode·动态规划
唐梓航-求职中1 小时前
编程-技术-算法-leetcode-288. 单词的唯一缩写
算法·leetcode·c#