560. 和为 K 的子数组

【题目】:560. 和为 K 的子数组

方法1. 前缀和

cpp 复制代码
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int res = 0;
        int n = nums.size();
        vector<int> preSum(n + 1, 0); // 下标从1开始存储
        for(int i = 0; i < n; ++i) {
            preSum[i + 1] = preSum[i] + nums[i];
        }
        for(int i = 0; i < n; ++i) {
            for(int j = i + 1; j <= n; ++j) {
                if(preSum[j] - preSum[i] == k) { // i 到 j 的和
                    ++res;
                }
            }
        }
        return res;
    }
};
  • 时间复杂度: O(n^2)
  • 空间复杂度: O(n)

使用preSum数组来存储nums的前缀和,preSum[i] = nums[0] + nums[1] + ... + nums[i - 1],这里一定要注意,存储的时候必须要从preSum[1]开始存,因为后边计算前缀和的时候,利用的是preSum[j] - preSum[i],得从preSum[1]开始存相减的时候才能不丢失num[i]的值。

方法2. 前缀和 + 哈希表

cpp 复制代码
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int res = 0;
        unordered_map<int, int> preSumCnt; // 前缀和为key的个数有value个
        preSumCnt[0] = 1; // 对于下标为0的元素,前缀和为0,个数为1
        int cur = 0;
        for(int i = 0; i < nums.size(); ++i) {
            cur += nums[i];
            // 统计cur - k的个数
            if(preSumCnt.find(cur - k) != preSumCnt.end()) {
                res += preSumCnt[cur - k];
            }
            preSumCnt[cur]++;
        }
        return res;
    }
};

使用preSumCnt的map计算前缀和为key的个数有value个。

对于下标为0之前的元素,前缀和为0,个数有1个,这个需要赋初值,后边相加的时候都需要以这个开始。

在遍历的时候,如果找到一个前缀和为cur - k时,说明从之前的某个位置到当前位置的子数组和为k。如果遍历到i时,前缀和为cur,而题目要求找到和为k的子数组。如果存在一个位置j(j < i),其前缀和为cur - k,那么从位置j到位置i的子数组和为k。

相关推荐
Aczone2840 分钟前
硬件(六)arm指令
开发语言·汇编·arm开发·嵌入式硬件·算法
luckys.one5 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|7 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师7 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo37 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
好家伙VCC8 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
liulilittle9 小时前
IP校验和算法:从网络协议到SIMD深度优化
网络·c++·网络协议·tcp/ip·算法·ip·通信
bkspiderx11 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
中华小当家呐12 小时前
算法之常见八大排序
数据结构·算法·排序算法
沐怡旸12 小时前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试