🧩 Patterns
Prefix Sum
Subarray sum in O(1) after O(n) setup — the trick behind most subarray problems
Build a prefix array where prefix[i] = sum of arr[0..i-1]. Then any subarray sum from l to r = prefix[r+1] - prefix[l] in O(1). Extend with a hashmap to find subarrays with a target sum.
Language:
Python
Loading...
All languages — Subarray sum queries
JavaScript
const arr = [2, 4, 6, 8, 10];
const prefix = new Array(arr.length + 1).fill(0);
for (let i = 0; i < arr.length; i++) {
prefix[i + 1] = prefix[i] + arr[i];
}
const rangeSum = (l, r) => prefix[r + 1] - prefix[l];
console.log(rangeSum(1, 3)); // 18
console.log(rangeSum(0, 4)); // 30TypeScript
const arr: number[] = [2, 4, 6, 8, 10];
const prefix: number[] = new Array(arr.length + 1).fill(0);
for (let i = 0; i < arr.length; i++) {
prefix[i + 1] = prefix[i] + arr[i];
}
const rangeSum = (l: number, r: number): number => prefix[r + 1] - prefix[l];
console.log(rangeSum(1, 3)); // 18Java
int[] arr = {2, 4, 6, 8, 10};
int[] prefix = new int[arr.length + 1];
for (int i = 0; i < arr.length; i++) {
prefix[i + 1] = prefix[i] + arr[i];
}
// rangeSum(l, r) inclusive
System.out.println(prefix[4] - prefix[1]); // 6+8+10... wait
// range_sum(1,3) = prefix[4]-prefix[1] = (2+4+6+8)-(2) = 18 ✓
int rangeSum = prefix[3 + 1] - prefix[1];
System.out.println(rangeSum); // 18Go
package main
import "fmt"
func main() {
arr := []int{2, 4, 6, 8, 10}
prefix := make([]int, len(arr)+1)
for i, x := range arr {
prefix[i+1] = prefix[i] + x
}
rangeSum := func(l, r int) int {
return prefix[r+1] - prefix[l]
}
fmt.Println(rangeSum(1, 3)) // 18
fmt.Println(rangeSum(0, 4)) // 30
}C++
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> arr = {2, 4, 6, 8, 10};
vector<int> prefix(arr.size() + 1, 0);
for (int i = 0; i < arr.size(); i++) {
prefix[i + 1] = prefix[i] + arr[i];
}
auto rangeSum = [&](int l, int r) {
return prefix[r + 1] - prefix[l];
};
cout << rangeSum(1, 3) << endl; // 18
cout << rangeSum(0, 4) << endl; // 30
}