概念理解
前缀和是对既有的一个整数数组而言,一个前缀和数组preSum[i]表示nums[0]~nums[i]之间的和。
涉及子数组和的问题首先想到前缀和能不能解决。
前缀和有方向性,用前缀和作差来得到子数组的和的前提是一定用下标大范围大的前缀和减去下标小范围小的前缀和,举例,用preSum[5]可以减去preSum[3]求得nums[3]到nums[5]之间的和! 虽然preSum[3]减去preSum[5]也能得到一个数值,但是这个值没有一个实际存在的子数组与其对应。
前缀和不只适合求解一段连续区间的和,也适合标记一段连续区间的共性状态。比如,对一段连续区间加减相同的值1109. 航班预订统计,1094. 拼车; 又比如标记一段连续区间的递增递减特性2100. 适合打劫银行的日子
1109. 航班预订统计,1094. 拼车都是在一段区间上面做等值的加减法,借助前缀和不用真的遍历每一个数去做加减法,而是对区间的端点加减,然后从左到右或者从右到左遍历一遍即可,减少了时间复杂度。
题型总结
- AAA560. 和为 K 的子数组
用前缀和做差可以得到任何一个子数组的和 - AAA1109. 航班预订统计
左向右遍历结果数组,执行res[i] += res[i-1],实现区域等值增加。 - AAA1094. 拼车
用前缀和记录各个乘车区间的乘客数量,最后遍历数组看是否超出capacity - AAA974. 和可被 K 整除的子数组
要想子数组的和能整除k,要是这两个对应的前缀和的差求k的余数为0 - AAAA2100. 适合打劫银行的日子
前缀和除了适合处理数组和,也适合处理一个元素一侧有多少满足条件的元素,左右两个方向都遍历一次就能知道两侧的情况。 - AAA2055. 蜡烛之间的盘子
借助前缀和求出两个’|‘之间’*'的个数。