这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战
前缀和
总共对应leetcode的T303,T304,T560,T724,T1,T1248,T974,T523,T930
条件
一般而言,看到求和,连续不可变数组等字眼,可以考虑一下前缀和
一维数组
一维数组对应的是T303 ,整体框架:
- 初始化一个数组 preSum
- preSum 中存放的是累加和
- 根据条件查询区间内的累加和
主要就是将数组中的累加值先计算出来并存放,根据区间就可以通过 右侧累加和减去左侧累加和的方式 获得到
通过 preSum[right + 1] - preSum[left] 即可得到对应区间的值
二维数组
二维数组对应的是T304,是一维数组的升级版。整体框架仍然如一维数组,但要注意的地方在累加和和查询区间两部分。 二维数组的累加和就是把从原点开始的所有值依次相加
黑色方块的值就等于两个橙色方块,下方红色矩阵累加再减去多加的那块粉丝区域
preSum[i + 1][j + 1] = preSum[i][j + 1] + preSum[i + 1][j] + matrix[i][j] - preSum[i][j]
查询区间的计算方法刚好相反,因为已经得到了前缀和的二维数组,为了避免起始位置有特殊情况,因此一维数组和二维数组都会在最前面加上0作为初始值。
此时的查询区间右下角如果是row2,col2.在前缀和的二维数组中就会为row2 + 1, col2 + 1。
preSum[row2 + 1][col2 + 1] - preSum[row2 + 1][col1] - preSum[row1][col2 + 1] + preSum[row1][col1]
和为K的子数组。
对应T560
题中说明步骤中要累计求和,且是连续不可变数组 - 考虑前缀和。但要求的是符合条件的个数,因此这里使用到了哈希表,用哈希表存放累计和与对应的个数。
因此整体框架仍不变 - 只不过用哈希表存放累计和,并要判断当前值是否中哈希表中,不在就新增,在就个数+1。最后返回哈希表对应值的个数即可。