前缀和
前缀和适合在数组中频繁的求某一段区间的和
如果当前你要完成一个需求,给你一个数组nums,然后频繁的给你两个数字i和j,叫你求nums[i]到nums[j]区间的和。
按照我们一般的思维就是从i开始循环,循环到j,然后将其中的nums加起来,最后返回,这样子每次查找的渐进时间复杂度都是O(n)
但如果我们使用前缀和来做会是什么样子的呢?
首先我们创建一个保存前缀和的数组
int[] preNums = new int[nums.length+1];
preNums [0] = 0;
for(int i=0; i<nums.length; i++){
preNums[i+1] = preNums[i]+nums[i];
}
假设当前nums数组的值为:{2,5,9,6,7},则对应的前缀数组为
那么,对于我们求nums[i]到nums[j]的区间和,就相当与用preNums[j+1]-preNums[i]
下面我们来看一个leetcode的原题,和为K的子数组
利用我们上面学过的知识,我们很容易写出下面这个代码
c