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

差分数组知识笔记

文章目录

    • 使用场景
    • 生成差分数组
    • 复原差分数组
    • Python代码

使用场景

频繁对某个区间所有元素进行加减相同值,推荐使用差分数组,可以避免每一次计算都把整个区间的元素遍历一遍。

生成差分数组

在这里插入图片描述

设差分数组为diff_arr,原数组为source_arr,数组长度为n,其中:
diff_arr[0] = source_arr[0]
diff_arr[i] = source_arr[i] - source_arr[i - 1],其中1 <= i < n
接下来对diff_arr的区间[1,3]进行加3,我们只要对diff_arr[1]进行+3操作,对diff_arr[4]进行减3操作,总结为:
对区间[i, j]进行加x操作,只需要对diff_arr[i] + x和diff_arr[j + 1] - x

对图中红字做出解释: 这里之所以对diff_arr[4]进行减3,是因为在还原数组的时候,后一项需要加上前一项的值,而我们只对[1, 3]范围内做加3的操作,4并不在操作范围内,所以需要提前减掉3。

复原差分数组

在这里插入图片描述
设复原数组为restore_arr,restore_arr第一项与diff_arr第一项相等,即:
restore_arr[0] = diff_arr[0]
restore_arr从第二项开始,restore_arr每一项等于diff_arr的当前项加上复原好的前一项,即:
restore_arr[i] = diff_arr[i] + restore_arr[i - 1],其中1 <= i < n

Python代码

class DiffArray:# 差分数组def initial(self, nums):# 初始化差分数组n = len(nums)diff = [0] * ndiff[0] = nums[0]for i in range(1, n):diff[i] = nums[i] - nums[i - 1]return diffdef increment(self, diff, i, j, val):# 加减操作diff[i] += valif j < len(diff) - 1:diff[j + 1] -= valdef restore(self, diff):# 恢复数组for i in range(1, len(diff)):diff[i] = diff[i] + diff[i - 1]if __name__ == '__main__':source_arr = [4, 3, 5, 6, 1]obj = DiffArray()diff_arr = obj.initial(source_arr)  #初始化差分数组obj.increment(diff_arr, 1, 3, 3)  # 区间[1, 3]做+3操作obj.restore(diff_arr)print(diff_arr)

相关文章:

  • java 加密算法的简单使用
  • 医学写作人才管理策略
  • Leetcode 刷题记录 11 —— 二叉树第二弹
  • 获取 Stream 对象的方式
  • 内存管理(第五、六章)
  • RocketMQ 深度解析:消息中间件核心原理与实践指南
  • AUTOSAR图解==>AUTOSAR_SRS_ICUDriver
  • 关于 Web 安全:5. 认证绕过与权限控制分析
  • 前端面经-虚幻引擎5
  • 嵌入式项目之QT页面制作
  • Python笔记:windows下编译python3.8.20
  • 股票程序化交易-使用python获取新浪财经期货行情数据
  • 如何理解Pytorch中前向传播的计算过程
  • dify-plugin-daemon的.env配置文件
  • Java 流程控制:从「小白」到「能用」的 while 循环指南
  • DAY34
  • 市场需求文档撰写
  • 超大数值减法
  • 解决论文中字体未嵌入的问题
  • STM32中的SPI通信协议
  • 深圳网站建设网页制作/怎么做app推广和宣传
  • 网站特效网/成都seo技术
  • 公司旅游视频网站模板免费下载/一个免费的网站
  • 网站建设科/北京官网seo
  • 网站开发外包合同/百度推广怎么收费
  • 淘宝内部卷怎么做网站/如何建立一个自己的网站?