算法合集 - 2

101 阅读2分钟

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

前缀和

总共对应leetcode的T303,T304,T560,T724,T1,T1248,T974,T523,T930

条件

一般而言,看到求和,连续不可变数组等字眼,可以考虑一下前缀和

一维数组

一维数组对应的是T303 ,整体框架:

  1. 初始化一个数组 preSum
  2. preSum 中存放的是累加和
  3. 根据条件查询区间内的累加和
    主要就是将数组中的累加值先计算出来并存放,根据区间就可以通过 右侧累加和减去左侧累加和的方式 获得到

image.png 通过 preSum[right + 1] - preSum[left] 即可得到对应区间的值

二维数组

二维数组对应的是T304,是一维数组的升级版。整体框架仍然如一维数组,但要注意的地方在累加和和查询区间两部分。 二维数组的累加和就是把从原点开始的所有值依次相加

image.png 黑色方块的值就等于两个橙色方块,下方红色矩阵累加再减去多加的那块粉丝区域
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。

image.png preSum[row2 + 1][col2 + 1] - preSum[row2 + 1][col1] - preSum[row1][col2 + 1] + preSum[row1][col1]

和为K的子数组。

对应T560
题中说明步骤中要累计求和,且是连续不可变数组 - 考虑前缀和。但要求的是符合条件的个数,因此这里使用到了哈希表,用哈希表存放累计和与对应的个数。 因此整体框架仍不变 - 只不过用哈希表存放累计和,并要判断当前值是否中哈希表中,不在就新增,在就个数+1。最后返回哈希表对应值的个数即可。