Prefix Sum
Prefix sum is preprocessing that makes range sum queries instant. Instead of summing elements every time, you precompute cumulative sums. Then any range sum is just one subtraction.
The Core Idea
Build an array where prefix[i] = sum of all elements from 0 to i-1. Then sum(i, j) = prefix[j+1] - prefix[i]. O(n) preprocessing, O(1) per query.
The Key Insight
Sum from index i to j equals "sum from 0 to j" minus "sum from 0 to i-1". You're subtracting what you don't want from the total.
Building Prefix Sum
def buildPrefixSum(nums):
prefix = [0] # Start with 0
for num in nums:
prefix.append(prefix[-1] + num)
return prefix
# Query sum from index i to j (inclusive)
def rangeSum(prefix, i, j):
return prefix[j + 1] - prefix[i]
Classic: Subarray Sum Equals K
Count subarrays that sum to k:
def subarraySum(nums, k):
count = 0
prefix_sum = 0
seen = {0: 1} # prefix_sum -> count
for num in nums:
prefix_sum += num
# If prefix_sum - k exists, we found subarrays
if prefix_sum - k in seen:
count += seen[prefix_sum - k]
seen[prefix_sum] = seen.get(prefix_sum, 0) + 1
return count
When to Use Prefix Sum
- Range sum queries - Multiple queries on same array
- Subarray sum problems - Find subarrays with target sum
- 2D range queries - Extend to 2D prefix sums
- Running totals - Cumulative statistics
- Product queries - Prefix products work too
Pro Tip
When looking for subarrays with a specific sum, combine prefix sums with a hash map. If current prefix minus target exists in the map, you've found a valid subarray.