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]=0,v[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=0,hash={0:1}
  • 遍历第一个 1:sum=1,sum-k=-1不在 hash 中 → hash[1]设为 1
  • 遍历第二个 1:sum=2,sum-k=0在 hash 中(次数 1)→ ret=1,再将hash[2]设为 1
  • 最终ret=2,和示例结果一致

总结

  • 暴力前缀和:时间O(n²),空间O(n)(超时)
  • 前缀和 + 哈希表:时间O(n),空间O(n)(最优解)
相关推荐
信奥卷王3 小时前
[GESP202609 六级] 分树规划
算法
夏幻灵3 小时前
LeetCode 21:合并两个有序链表——双指针与哑节点详解
算法·leetcode·链表
徐小黑ACG4 小时前
Golang 基础05 结构体struct
开发语言·算法·golang
Navigator_Z5 小时前
LeetCode //C - 1286. Iterator for Combination
c语言·算法·leetcode
北极有牛5 小时前
cpp学习笔记--常量指针
java·开发语言·算法
GPU实战笔记5 小时前
云端 GPU 训练的账户余额提醒:它能说明什么,不能说明什么?
深度学习·算法·成本管理·gpu云计算·云端训练
浮链序6 小时前
怎么证明"你这个模型是偷我的"——把蒸馏变成取证工具
算法·安全·llm
小O的算法实验室6 小时前
IEEE TMC,面向异构物联网的多目标量子行为拓扑优化算法
算法
liliangcsdn6 小时前
派息率指标的应用探索和分析
大数据·算法