首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前缀和-560.和为k的子数组-力扣(LeetCode)

前缀和-560.和为k的子数组-力扣(LeetCode)

作者头像
白天的黑夜
发布2025-10-22 17:08:35
发布2025-10-22 17:08:35
10200
代码可运行
举报
运行总次数:0
代码可运行

一、题目解析

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

2.nums[i]范围为[-1000,1000],存在负数

3.由于2的题目条件,该题不能用双指针算法,不具备单调性 

二、算法原理

解法1:暴力解法->枚举 O(N^2)

固定一个值,向后枚举数组和,遇到sum == k仍需继续枚举,因为后面同样有可能出现sum == k的情况

解法2:前缀和+哈希表

用哈希表unordered_map<int,int> hash,统计前缀和出现的频率

细节问题:

1.前缀和加入哈希表的时机?
在判断hash表中是否存在sum[i]-k后加入哈希表,即在下一个位置计算前缀和时,哈希表内存储的是上次的前缀和,也就是[0,i-1]区间的前缀和
2.不用真的创建一个前缀和数组,使用变量sum标记前一个位置的前缀和
3.如果整个前缀和等于k呢?
即在hash中,hash[0]=1

三、代码示例

代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
public:
    int subarraySum(vector<int>& nums, int k)
    {
        unordered_map<int,int> hash;
        hash[0] = 1;
        int sum = 0,ret = 0;
        for(auto e : nums)
        {
            sum += e;
            if(hash.count(sum - k)) ret += hash[sum - k];
            hash[sum]++;
        }
        return ret;
    }
};

看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见! 

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目解析
    • 1.子数组是数组中元素的连续非空序列
    • 2.nums[i]范围为[-1000,1000],存在负数
    • 3.由于2的题目条件,该题不能用双指针算法,不具备单调性 
  • 二、算法原理
    • 解法1:暴力解法->枚举 O(N^2)
      • 固定一个值,向后枚举数组和,遇到sum == k仍需继续枚举,因为后面同样有可能出现sum == k的情况
    • 解法2:前缀和+哈希表
      • 用哈希表unordered_map<int,int> hash,统计前缀和出现的频率
    • 细节问题:
      • 1.前缀和加入哈希表的时机?
      • 2.不用真的创建一个前缀和数组,使用变量sum标记前一个位置的前缀和
      • 3.如果整个前缀和等于k呢?
  • 三、代码示例
  • 看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见! 
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档