【算法题】前缀和的应用 --- 325. 和等于 k 的最长子数组长度

文章介绍了前缀和的概念,即数组中一段连续子数组的累计和,并展示了如何在O(1)时间内求解区间和。接着,文章详细解释了如何运用前缀和解决力扣325题,通过哈希表存储前缀和及其索引,寻找和为k的最长子数组长度,优化了时间复杂度。
摘要由CSDN通过智能技术生成

一、前缀和

前缀和定义:
当i >= 1, preSum[i]表示从item[0]到item[i -1]所有元素的和;
当i = 0, preSum[0] = 0;//记得初始化!!!
递推公式:preSum[i + 1] = preSum[i] + item[i];

前缀和能在O(1)的时间内求出一段区间内的数的和
按照递推公式,可以计算出每个字数组的和,子数组[i…j]的和就是preSum[j + 1] - preSum[i];
如果区间长度为1,即j = i, item[i] = preSum[i + 1] - presum[i];

二、力扣325. 和等于 k 的最长子数组长度

class Solution {
public:
    int maxSubArrayLen(vector<int>& nums, int k) {
        int maxSize = 0;
        //哈希表,第一个值记录前缀和,第二个值记录前缀和第一次出现的位置(因为需要保证子数组最长)
        unordered_map<long long, int> preSumIndex;
        preSumIndex[0] = 0;//初始化 0下标处的前缀和为0!!!
        long long preSum = 0;
        for (int i = 0; i < nums.size(); ++i) {
            preSum += nums[i];
            if (preSumIndex.count(preSum) == 0)//记录这个值第一次出现的位置
                preSumIndex[preSum] = i + 1;
            if (preSumIndex.count(preSum - k)) {//往前探查,看是否存在以i节点为结尾的和为k的子数组
                maxSize = max(maxSize, i - preSumIndex[preSum - k] + 1);
            }
        }
        return maxSize;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值