【算法】: 前缀和算法(利用o(1)的时间复杂度快速求区间和)
前缀和算法:高效处理区间求和的利器
目录
- 引言
- 什么是前缀和
- 前缀和的基本实现
- 前缀和的作用
- 前缀和的典型应用场景
- 前缀和的优缺点分析
- 实战例题解析
引言
- 区间求和问题的普遍性
- 暴力解法的时间复杂度问题
- 前缀和算法的核心思想
什么是前缀和
- 前缀和的数学定义
通俗来讲,前缀和就是从某个位置到最开始的所有数据的和我们可以称作前缀和
- 一维前缀和的概念
从当前位置到数组开始的所有数据的和。
- 二维前缀和的概念
从当前位置到矩阵和开始((0,0))构成的局部矩阵的所有元素之和。
前缀和的基本实现
前缀和的基本实现非常简单,通过简单的遍历操作就能实现。
前缀和的作用
由于前缀和表示某个位置到数组或矩阵开头的和,因此前缀和数组可以快速帮助我们获取任意区间的和。
前缀和的典型应用场景
- 静态数组的频繁区间查询
- 矩阵中的子矩阵求和
- 结合哈希表解决特定问题
- 和为K的子数组个数
- 连续子数组和整除问题
- 数据处理与统计应用
前缀和的优缺点分析
优点
- 查询时间复杂度O(1)
- 实现简单高效
- 扩展性强
缺点
- 需要额外O(n)空间
- 原始数组不可变(动态数组需用其他结构)
- 高维时空间消耗大
实战例题解析
-
一维例题:LeetCode LCR 010. 题目链接
解法和思路:
本题通过hash进行记忆化存储前缀和,存储我们遍历时候当前位置之前的所有存在的前缀和,我们可以通过查找hash表判断是否存在我们需要的前缀和的值。 -
二维例题:LeetCode 304. 二维区域和检索 - 矩阵不可变
解法和思路:
同一维思想相仿,只不过在构造的时候二维更加复杂:
- 构建prefix(前缀和矩阵) : prefix[i][j] = prefix[i - 1][j] + prefix[i][j - 1] - prefix[i -1][j - 1] + matrix[i][j]
- 得到任意一个矩阵的和
Sum({i,j} -> {s,t}) = prefix[s][t] - prefix[s][j - 1] - prefix[i - 1][t] + prefix[i - 1][j - 1]
- 拓展例题:统计美丽子数组数目(结合位运算前缀和)
这道题可以自行思考:leetcode上面也有对应的题解。