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

前缀和与差分进阶总结 | 技巧归纳与实战应用

前缀和与差分进阶总结 | 技巧归纳与实战应用

引言

前缀和与差分是数组处理中两种重要且互补的技术。它们看似简单,却在 LeetCode 和实际工程中有着广泛的应用。前缀和将区间查询从 O(n) 优化到 O(1),差分将区间更新从 O(n) 优化到 O(1)。两者的结合使用可以高效解决大量区间查询和更新问题。

本文将对前缀和与差分的进阶应用进行系统性的总结归纳,帮助读者建立完整的知识体系。

前缀和的类型分类

一维前缀和

一维前缀和是最基础的形式。给定数组 nums,定义 prefix[i] = sum(nums[0:i]),即前 i 个元素的和。使用前缀和,可以 O(1) 计算任意区间 [l, r] 的和:sum[l, r] = prefix[r+1] - prefix[l]。

一维前缀和的应用场景包括:

  • LeetCode 303:区域和检索(不可变数组)
  • LeetCode 560:和为 K 的子数组
  • LeetCode 724:寻找数组的中心下标

二维前缀和

二维前缀和是前缀和概念在二维数组上的扩展。给定矩阵 matrix,定义 prefix[i][j] 为以 (0, 0) 为左上角、(i, j) 为右下角的矩形区域中所有元素的和。

二维前缀和的计算公式:prefix[i][j] = matrix[i][j] + prefix[i-1][j] + prefix[i][j-1] - prefix[i-1][j-1]

二维前缀和的应用场景包括:

  • LeetCode 304:二维区域和检索(不可变矩阵)
  • LeetCode 1314:矩阵区域和

前缀积与前缀最大值

前缀和可以推广到其他满足结合律的运算:

  • 前缀积:prefix[i] = prod(nums[0:i])
  • 前缀最大值:prefix[i] = max(nums[0:i])
  • 前缀最小值:prefix[i] = min(nums[0:i])

这些推广在特定问题中非常有用。

差分的类型分类

一维差分

一维差分数组 diff 定义为:diff[i] = nums[i] - nums[i-1](i > 0),diff[0] = nums[0]。

区间更新 [l, r] 加上 val 的操作转化为:diff[l] += val,diff[r+1] -= val。

差分的核心价值在于:将 O(n) 的区间更新转化为 O(1) 的单点更新,最后通过一次前缀和计算得到最终结果。

二维差分

二维差分用于批量更新矩阵中的矩形区域。更新矩形 [(r1, c1), (r2, c2)] 加上 val 的操作转化为四个角落的差分更新:

  • diff[r1][c1] += val
  • diff[r1][c2+1] -= val
  • diff[r2+1][c1] -= val
  • diff[r2+1][c2+1] += val

然后对差分数组求二维前缀和得到更新后的矩阵。

前缀和与哈希表结合

核心思想

前缀和与哈希表结合是解决"子数组统计"问题的强大工具。其核心思想是:将"子数组的某种属性"转化为"两个前缀和的差",然后使用哈希表快速查找满足条件的配对。

典型应用

LeetCode 560(和为 K 的子数组):子数组和等于 K <=> 两个前缀和的差等于 K

def subarraySum(nums, k): prefix_sum = 0 count = 0 prefix_map = {0: 1} for num in nums: prefix_sum += num count += prefix_map.get(prefix_sum - k, 0) prefix_map[prefix_sum] = prefix_map.get(prefix_sum, 0) + 1 return count

LeetCode 523(连续的子数组和):子数组和是 K 的倍数 <=> 两个前缀和对 K 同余

def checkSubarraySum(nums, k): prefix_sum = 0 index_map = {0: -1} for i, num in enumerate(nums): prefix_sum += num mod = prefix_sum % k if k != 0 else prefix_sum if mod in index_map: if i - index_map[mod] >= 2: return True else: index_map[mod] = i return False

LeetCode 1248(统计优美子数组):恰好 K 个奇数 <=> 两个前缀和(奇数计数)的差等于 K

def numberOfSubarrays(nums, k): prefix_sum = 0 count = 0 prefix_map = {0: 1} for num in nums: prefix_sum += num % 2 count += prefix_map.get(prefix_sum - k, 0) prefix_map[prefix_sum] = prefix_map.get(prefix_sum, 0) + 1 return count

滑动窗口与前缀和

滑动窗口的特殊情况

对于有序数组或具有单调性的数组,滑动窗口可以代替哈希表。例如,在和至少为 K 的子数组问题中:

def minSubArrayLen(k, nums): left = 0 current_sum = 0 min_len = float('inf') for right in range(len(nums)): current_sum += nums[right] while current_sum >= k: min_len = min(min_len, right - left + 1) current_sum -= nums[left] left += 1 return min_len if min_len != float('inf') else 0

何时使用滑动窗口 vs 哈希表

滑动窗口适用于:

  • 数组元素有单调性(如正数数组)
  • 需要找最长/最短子数组
  • 问题具有"扩张-收缩"的模式

哈希表适用于:

  • 数组元素没有单调性
  • 需要找恰好等于某值
  • 问题转化为前缀和差的问题

前缀积的高级应用

除自身以外数组的乘积

def productExceptSelf(nums): n = len(nums) answer = [1] * n for i in range(1, n): answer[i] = answer[i - 1] * nums[i - 1] product = 1 for i in range(n - 2, -1, -1): product *= nums[i + 1] answer[i] *= product return answer

累加和与累乘积的结合

在某些问题中,可能需要同时考虑累加和累乘。核心思想类似,只是需要处理乘法的特殊性(如零的处理)。

差分的扩展应用

航班预订问题

def corpFlightBookings(bookings, n): diff = [0] * (n + 1) for first, last, seats in bookings: diff[first - 1] += seats diff[last] -= seats result = [0] * n result[0] = diff[0] for i in range(1, n): result[i] = result[i - 1] + diff[i] return result

拼车问题

def carPooling(trips, capacity): diff = [0] * 1001 for num, start, end in trips: diff[start] += num diff[end] -= num current = 0 for i in range(1001): current += diff[i] if current > capacity: return False return True

实战问题分类

区间求和类

区间求和类问题要求在一个数组上进行多次区间查询。如果数组不可变,可以使用前缀和;如果需要支持更新,可以使用树状数组或线段树。

典型问题:

  • LeetCode 303:区域和检索(不可变)
  • LeetCode 304:二维区域和检索(不可变)
  • LeetCode 307:区域和检索(可变)

子数组统计类

子数组统计类问题要求统计满足某种条件的子数组数量。通常将问题转化为前缀和的配对问题,使用哈希表解决。

典型问题:

  • LeetCode 560:和为 K 的子数组
  • LeetCode 523:连续的子数组和(K 的倍数)
  • LeetCode 930:和相同的二元子数组

批量更新类

批量更新类问题要求对数组进行多次区间更新,最后查询最终结果。使用差分数组可以将每次更新优化到 O(1)。

典型问题:

  • LeetCode 1109:航班预订统计
  • LeetCode 1094:拼车

复杂度分析

时间复杂度

前缀和构造:O(n)
差分构造:O(n)
单次区间查询:O(1)(前缀和)
单次区间更新:O(1)(差分)
前缀和 + 哈希表:O(n)

空间复杂度

前缀和:O(n)
差分:O(n)
前缀和 + 哈希表:O(n)

面试中的常见问题

问题1:如何处理负数前缀和?

负数前缀和与正数前缀和没有本质区别。取模运算时需要注意 Python 和 Java 的差异。

问题2:如何在 O(1) 空间内解决前缀和问题?

某些问题可以通过数学推导避免使用哈希表。例如,寻找和为 0 的最长子数组可以通过记录第一次出现的位置来 O(1) 空间解决。

问题3:如何处理大数据范围?

在某些语言中,需要考虑整数溢出。可以使用 long 类型或 Python 的自动扩展整数。

总结

前缀和与差分是数组处理的两种核心技术。前缀和将区间查询优化到 O(1),差分将区间更新优化到 O(1)。两者的结合使用可以高效解决大量区间查询和更新问题。

前缀和与哈希表的结合是解决"子数组统计"问题的强大工具。通过将问题转化为前缀和的配对,我们可以在 O(n) 时间内解决看似需要 O(n²) 的问题。

希望本文的总结能够帮助读者建立完整的前缀和与差分知识体系,在面试和实际工作中游刃有余。

http://www.jsqmd.com/news/874210/

相关文章:

  • Go语言CI/CD流水线实践
  • 【GO context 】上下文取消/超时的本质
  • 无语,Trae的AI编程想混过去啊,我就说了点重话:我只要结果,我需要一个成语接龙程序,这个程序能正确运行,可以通过验收!
  • 2026第三方配送平台选型指南:成都本地跑腿加盟/成都本地配送平台/成都第三方配送平台/成都聚合配送平台/成都自配送平台/选择指南 - 优质品牌商家
  • 2026泳池设计优质厂家推荐:泳池设计/洗浴厂家/洗浴工程/洗浴改造/洗浴施工/洗浴设备/温泉洗浴设计/游泳池改造/选择指南 - 优质品牌商家
  • 企业级条码处理方案:ZXing.Net在.NET生态中的架构实践与性能优化
  • 【Appium 系列】第18节-重试与容错 — 移动端测试的稳定性保障
  • 2026泳池建造厂家推荐:酒店洗浴、户外泳池、泳池工程、泳池水处理、泳池设备、洗浴厂家、洗浴工程、洗浴改造、洗浴施工选择指南 - 优质品牌商家
  • 锌钢护栏网技术解析:四川公路铁路护栏网、四川双边丝护栏网、四川围栏网、四川学校球场围栏、四川市政道路护栏网、四川牛栏围栏网选择指南 - 优质品牌商家
  • 2026年Q2四川应急物资厂家评测:应急消防设备厂家/应急物资厂家电话/抗洪抢险应急设备/消防工具厂家/消防智能设备/选择指南 - 优质品牌商家
  • 2026成都靠谱金属建材回收公司推荐:工厂废料回收/工地废料回收/库房物资回收/废旧机器回收/废铁回收/废铜回收/选择指南 - 优质品牌商家
  • 毕业论文神器!2026年必备AI论文软件榜单,免费版也能写合规初稿
  • 2026年Q2西南地区测绘仪租赁服务机构排行盘点:华测rtk/华测无人船/地形测量/大疆无人机/徕卡全站仪/手持扫描仪/选择指南 - 优质品牌商家
  • 2026年当下河北工程网格布实力厂商剖析与精准选型指南 - 2026年企业推荐榜
  • 2026年成都学历提升选校指南:口碑机构成都市成华区新概念外语培训学校深度 - 2026年企业推荐榜
  • 2026年当下耐磨输送带选型指南:鼎基机械输送有限公司深度解析 - 2026年企业推荐榜
  • 2026年5月,如何精准对接武汉地区优质橡胶助剂供应商? - 2026年企业推荐榜
  • 2026年第二季度,昆明膜结构源头工厂如何引领市场新需求 - 2026年企业推荐榜
  • 【独家首发】Claude代码生成能力黄金分级标准(L1-L5):附赠可落地的团队接入评估清单(限前500名下载)
  • AI知识管理不是工具升级,而是教学主权重构:一位特级教师用18个月完成“教案→知识流→认知干预”三级跃迁(全程数据脱敏实录)
  • Claude+Query Store双引擎协同优化(仅限AWS RDS与Azure SQL托管实例的私有API调用指南)
  • 合同纠纷律师哪个好?李静律师:复杂商事合同争议解决专家 - 外贸老黄
  • 当Agent开始质疑你的原始数据——AI驱动的数据质量自治体系构建(含动态污点追踪与因果溯源模块)
  • 2026气体扩散层权威供应商精选推荐:气体扩散过滤板、气体扩散金属板、气体扩散钛板、气体扩散钛滤板、电解槽滤板选择指南 - 优质品牌商家
  • 2026防爆门厂家推荐:快速门推荐/折叠门厂家/折叠门推荐/推拉门厂家/推拉门推荐/提升门推荐/泄爆窗厂家/泄爆门厂家/选择指南 - 优质品牌商家
  • 3层深度清理技术:Display Driver Uninstaller显卡驱动彻底卸载解决方案
  • 2026安防行业监控操作台厂家选购推荐:落地式机柜/一体化机柜/不锈钢操作台厂家/冷通道机柜/四川机柜厂家推荐/选择指南 - 优质品牌商家
  • 零售智能体上线周期缩短至11天,如何复用这3套经GDPR+等保三级认证的Agent模板?
  • Lovable低代码向无代码跃迁的关键阈值:当业务逻辑复杂度>13个条件分支时,必须启用这3个隐藏扩展机制
  • 分布式系统测试:验证分布式系统的正确性和性能