当前位置: 首页 > news >正文

前缀和技巧

一、前缀和适用场景

在解题时需要快速得出数组某一区间和的时候就可以用前缀和。

二、前缀和存储形式

一维数组时,可以是大小n + 1的数组,预留一个和是0的位置。

一维数组还可以用哈希表存储在下标 i 位置之前的所有前缀和,这样快速查找。

二维或多维数组建议预留一维0

三、前缀和普遍公式

1、一维前缀和

预留0位置,i 从1开始,dp数组下标 - 1对应原数组下标

dp[i] = dp[i - 1] + nums[i - 1]

2、二维前缀和

(1)初始化前缀和数组

dp[x2][y2] = dp[x1 - 1][y2] + dp[x2][y1 - 1] + nums[x2][y2] - dp[x1 - 1][x2 - 1]

(2)使用前缀和数组

得到(x1, y1)到(x2, y2)中间所有数的和

ans = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1]

四、例题

1、一维数组q次查询

【模板】前缀和_牛客题霸_牛客网

注意两数相加溢出问题

2、二维数组q次查询

【模板】二维前缀和_牛客题霸_牛客网

3、寻找中心数组下标

. - 力扣(LeetCode)

4、除自身以外数组乘积

一个前缀乘加一个后缀乘数组。

5、和为k子数组

. - 力扣(LeetCode)

可以用哈希表存储 i 位置之前的前缀和和出现的次数。

循环开头先更新前缀和数组 sum += nums[i]

在 0 ~ i  范围中有结果,则上图得出的公式 ans += hash[sum[i] - k]

不要忘记一开始有一个0,hash[0] = 1

6、和可被k整除的子数组

. - 力扣(LeetCode)

注意:
(1)同余定理

(a - b)% k = 0 -> a % k == b% k

(2)防止负数取模

((a % k) + k) % k

(3)一开始0的余数是0

hash[0] = 1

依据题意,哈希表存储前缀和的余数,在哈希表中找到多少个前缀和余数等于 sum % k

7、连续数组

. - 力扣(LeetCode)

把所有的0变成-1,等于求数组中和为0的最长子数组长度。

哈希表里面存最开始前缀和的出现下标。

8、矩阵区域和

. - 力扣(LeetCode)


http://www.mrgr.cn/news/20941.html

相关文章:

  • 伦敦银ATR策略
  • OA 考勤组操作日志查询(ecology_biz_log(操作日志表))
  • 每日一练:找到字符串中所有字母异位词
  • 微软RD客户端 手机 平板 远程控制 Windows桌面
  • 【2024国赛B题】高教杯全国大学生数学建模国赛建模过程+完整代码论文全解全析
  • ffmpeg音视频开发从入门到精通——ffmpeg下载编译与安装
  • 在 Linux 上以 All-in-One 模式安装 KubeSphere
  • SAP ABAP 程序迁移工具 SAPLINK ABAP GIT
  • Docker进入容器运行命令及查看docker容器日志
  • vue ts 本地缓存数据
  • html 单页面路由模式hash和history
  • 用fastapi搭建cpca地址提取服务接口
  • [一文讲透] STM32实现ADC转换并使用DMA传输
  • 鸿蒙轻内核M核源码分析系列八 静态内存MemoryBox
  • k8s上搭建devops环境
  • 99%的Java程序员不知道的Java Instrument
  • tkinter中按比例放大
  • HTTP与HTTPS在软件测试中的解析
  • SpringBoot项目用Aspose-Words将Word转换为PDF文件正常显示中文的正确姿势
  • 在深度学习计算机视觉的语义分割中,Boundary和Edge的区别是?