Prefix Sum Array

Precompute cumulative sums in O(n) so any range sum query [l..r] answers in O(1). prefix[i] = sum of nums[0..i-1], then rangeSum = prefix[r+1] − prefix[l].

Array Range Query HashMap Build O(n) Query O(1) Space O(n)
📋 When to Use
  • Multiple range sum queries on a static array
  • Count subarrays whose sum equals target k
  • Find subarrays divisible by k — use prefix mod
  • 2D problems: submatrix sums, rectangle queries
💡 Brute-force O(n) per query becomes O(1) after O(n) build. Pair with a HashMap to count prefix sums for subarray problems in one pass.
⚡ Complexity
Build
O(n)
Query
O(1)

One pass builds the prefix array of size n+1. Each subsequent range query is a single subtraction. Space is O(n) for the prefix array, O(1) extra per query.

Live Animation · Prefix Sum · Build + Range Query
Problem Given nums = [3, 0, 4, 2, 1], build a prefix sum array then answer the range query: sum(1, 3) — what is the sum of elements from index 1 to 3 inclusive?
Answer: nums[1]+nums[2]+nums[3] = 0+4+2 = 6  ·  Computed as prefix[4] − prefix[1] = 9 − 3 = 6
Step 1 / —
🔨 Build Prefix Array
🔍 Range Query
✅ Done
nums = [3, 0, 4, 2, 1]     prefix[0..5] (size = n+1 = 6)
nums
pfx
prefix[4] − prefix[1]  =  93  =  6
i =
prefix[i] =
Click ▶ Play or Next ▶ to start
int[] prefix = new int[nums.length + 1]; // prefix[0] = 0
Java Pattern SkeletonJAVA
// ── 1. Build prefix sum array ─────────────────────────────────────
int[] prefix = new int[nums.length + 1]; // prefix[0] = 0 (sentinel)
for (int i = 0; i < nums.length; i++) {
    prefix[i + 1] = prefix[i] + nums[i];   // running sum
}

// ── 2. Range sum query: O(1) per query ───────────────────────────
// sum of nums[l..r] = prefix[r+1] - prefix[l]
int rangeSum = prefix[r + 1] - prefix[l];

// ── 3. Count subarrays with sum = k (HashMap variant) ────────────
Map<Integer, Integer> cnt = new HashMap<>();
cnt.put(0, 1);  // empty prefix — handle subarrays starting at index 0
int sum = 0, count = 0;
for (int num : nums) {
    sum += num;
    count += cnt.getOrDefault(sum - k, 0); // if (sum-k) seen → subarrays sum to k
    cnt.merge(sum, 1, Integer::sum);
}
return count;
🎯 Practice Problems