560. 和为K的连续子数组 发表于 2022-07-03 分类于 leetcode 阅读次数: Valine: 本文字数: 923 阅读时长 ≈ 1 分钟 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 * 104-1000 <= nums[i] <= 1000-107 <= k <= 107 暴力枚举, 无法通过OJ123456789101112131415class Solution {public: int subarraySum(vector<int>& nums, int k) { int n = nums.size(), ans = 0; for (int start = 0; start < n; start++) { int tmp = 0; for (int end = start; end < n; end++) { tmp += nums[end]; if (tmp == k) ans++; } } return ans; }}; 前缀和+哈希表记录pre[i]为序号为0-i的数组中所有数的和。对于序号为[i, j]的子树组来说,如果pre[j]-pre[i-1] == k, 则其为一个目标答案。 可以考虑用一个哈希表记录所有前缀和出现的次数,遍历一次即可求得答案。 时间复杂度和空间复杂度均为O(n) 123456789101112131415161718class Solution {public: int subarraySum(vector<int>& nums, int k) { int n = nums.size(), ans = 0, pre = 0; unordered_map<int, int> mp; mp[0] = 1; for (int start = 0; start < n; start++) { pre += nums[start]; if (mp.find(pre-k) != mp.end()) { ans += mp[pre-k]; } mp[pre]++; } return ans; }}; 坚持原创分享,您的支持将鼓励我继续创作 打赏 微信支付 支付宝 本文作者: Jacob Jin 本文链接: http://kingsleynuaa.github.io/2022/07/03/leetcode-subarray-sum-equals-k/ 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! 欢迎关注我的其它发布渠道 Twitter 微信公众号 ------------- 本文结束,感谢阅读 如有问题可留言交流 -------------