假设你是一家大型超市的店长,管理着 10000 个货架的商品库存。
老板突然问:"从第 3 号货架到第 15 号货架,今天总共增加了多少件商品?"
按照常规做法,你需要把 3 号到 15 号的每日变动量挨个加起来,要做 13 次加法。如果老板每天问几十次类似的问题,你会累疯!
有没有 O(1) 就能回答的方法?
聪明的做法(前缀和):每天晚上算一次"累计总增量"。当老板再问 3 到 15 号的增量时,你只需拿15号的累计值减去2号的累计值,一秒钟就能给出答案!
更聪明的做法(差分):如果老板说"把 5 号到 10 号货架全部增加 50 件",你也不用挨个改,只需在 5 号记一个"+50",在 11 号记一个"-50",最后统一结算即可。
前缀和 = 区间求和的利器 | 差分 = 区间修改的利器
💡 前缀和与差分的关系
前缀和:预处理一次 O(n),之后每次区间查询 O(1)。适合静态数组 + 多次查询的场景。
差分:每次区间修改 O(1),最后统一还原 O(n)。适合多次修改 + 最后查询的场景。
两者互为逆运算:对差分数组求前缀和 = 还原原数组;对原数组求差分 = 得到差分数组。