一、前缀和
前缀和定义:
当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;
}
};