【前缀和计算和+哈希表查找次数】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)
。
#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