LeetCode 560题:和为K子数组最优解

题目理解

给定整数数组nums和整数k,统计连续非空 子数组中和为k的个数。

  • 示例 1:nums = [1,1], k=2 → 输出 2([1,1][1(第二个)]
  • 示例 2:nums = [1,2,3], k=3 → 输出 2([1,2][3]

解法 1:暴力前缀和(超时预警)

首先想到前缀和数组的基础思路:

  1. 构造前缀和数组v,其中v[i]表示nums[0..i-1]的和(v[0]=0v[1]=nums[0],以此类推)
  2. 任意子数组nums[j..i-1]的和 = v[i] - v[j],遍历所有i>j,统计v[i]-v[j]==k的次数

代码如下:

cpp

运行

复制代码
int subarraySum(vector<int>& nums, int k) {
    vector<int> v(nums.size()+1);
    int count=0;
    // 构造前缀和数组
    for(int i=1;i<=nums.size();++i) {
        v[i] = v[i-1] + nums[i-1];
    }
    // 遍历所有i>j的组合
    for(int i=1;i<=nums.size();++i) {
        for(int j=0;j<i;++j) {
            if(v[i]-v[j] == k) count++;
        }
    }
    return count;
}

但这个方法的时间复杂度是O(n²),对于n=2e4的用例来说会超时,必须优化。

解法 2:前缀和 + 哈希表(O (n) 时间)

核心思路是用哈希表记录前缀和出现的次数,避免二次遍历:

  1. 维护一个变量sum,表示当前遍历到的前缀和(代替前缀和数组)
  2. 用哈希表hash存储前缀和的值 → 出现的次数 ,初始化hash[{0,1}](对应前缀和为 0 的情况,防止第一个元素就是 k 的情况)
  3. 遍历数组时:
    • 累加sum得到当前前缀和
    • sum - k在哈希表中存在,说明存在前缀和为sum-k的子数组,其到当前位置的子数组和为 k,将次数累加到结果
    • 将当前前缀和sum的出现次数存入哈希表

优化后的代码:

cpp

运行

复制代码
int subarraySum(vector<int>& nums, int k) {
    unordered_map<int, int> hash = {{0, 1}}; // 初始化前缀和0出现1次
    int ret = 0, sum = 0;
    for (int e : nums) {
        sum += e; // 当前前缀和
        // 统计有多少个前缀和等于sum-k
        if (hash.count(sum - k)) {
            ret += hash[sum - k];
        }
        hash[sum]++; // 记录当前前缀和的出现次数
    }
    return ret;
}

为什么这样能行?

举个例子(nums=[1,1],k=2):

  • 初始化:sum=0hash={0:1}
  • 遍历第一个 1:sum=1sum-k=-1不在 hash 中 → hash[1]设为 1
  • 遍历第二个 1:sum=2sum-k=0在 hash 中(次数 1)→ ret=1,再将hash[2]设为 1
  • 最终ret=2,和示例结果一致

总结

  • 暴力前缀和:时间O(n²),空间O(n)(超时)
  • 前缀和 + 哈希表:时间O(n),空间O(n)(最优解)
相关推荐
月挽清风1 小时前
代码随想录第七天:
数据结构·c++·算法
小O的算法实验室1 小时前
2026年AEI SCI1区TOP,基于改进 IRRT*-D* 算法的森林火灾救援场景下直升机轨迹规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小郭团队2 小时前
2_1_七段式SVPWM (经典算法)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·硬件架构·arm·dsp开发
充值修改昵称2 小时前
数据结构基础:从二叉树到多叉树数据结构进阶
数据结构·python·算法
Deepoch2 小时前
Deepoc数学大模型:发动机行业的算法引擎
人工智能·算法·机器人·发动机·deepoc·发动机行业
-To be number.wan2 小时前
【数据结构真题解析】哈希表中等难度挑战:冲突处理与查找效率深度剖析
数据结构·哈希算法
浅念-2 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法
Hcoco_me3 小时前
大模型面试题84:是否了解 OpenAI 提出的Clip,它和SigLip有什么区别?为什么SigLip效果更好?
人工智能·算法·机器学习·chatgpt·机器人
BHXDML3 小时前
第九章:EM 算法
人工智能·算法·机器学习
却道天凉_好个秋4 小时前
目标检测算法与原理(三):PyTorch实现迁移学习
pytorch·算法·目标检测