Pattern: Prefix Sum & Difference Arrays
πΉ Why This Pattern?
- Many problems involve subarray sums, ranges, or updates.
- Brute force (
O(nΒ²)
) β Prefix Sum / Difference Array reduces it to O(n). -
Common for:
- Subarray sum problems (K-sum, max sum, divisible sum).
- Interval addition queries.
- String prefix counts.
- Range updates (especially in competitive coding).
π₯ Sub-Patterns
1οΈβ£ Classic Prefix Sum (Static Queries)
Example: Range Sum Query β Immutable (Amazon)
class NumArray {
private int[] prefix;
public NumArray(int[] nums) {
prefix = new int[nums.length + 1];
for (int i = 0; i < nums.length; i++) {
prefix[i + 1] = prefix[i] + nums[i];
}
}
public int sumRange(int left, int right) {
return prefix[right + 1] - prefix[left];
}
}
Complexity:
- Preprocessing:
O(n)
- Query:
O(1)
2οΈβ£ Prefix Sum for Subarray Problems
Example: Subarray Sum Equals K (Google, Amazon)
class Solution {
public int subarraySum(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
int prefix = 0, count = 0;
for (int num : nums) {
prefix += num;
if (map.containsKey(prefix - k)) {
count += map.get(prefix - k);
}
map.put(prefix, map.getOrDefault(prefix, 0) + 1);
}
return count;
}
}
π‘ Trick: Store prefixSum[i]
counts in HashMap.
3οΈβ£ Difference Array (Efficient Range Updates)
Example: Corporate Flight Bookings (LeetCode 1109, Amazon/Google)
class Solution {
public int[] corpFlightBookings(int[][] bookings, int n) {
int[] diff = new int[n + 1];
for (int[] b : bookings) {
diff[b[0] - 1] += b[1];
diff[b[1]] -= b[1];
}
int[] result = new int[n];
result[0] = diff[0];
for (int i = 1; i < n; i++) {
result[i] = result[i - 1] + diff[i];
}
return result;
}
}
Idea:
- Use difference array for range increments in
O(1)
. - Then take prefix sum at the end.
4οΈβ£ 2D Prefix Sum (Matrix Problems)
Example: Range Sum Query 2D (Google/Microsoft)
class NumMatrix {
private int[][] prefix;
public NumMatrix(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
prefix = new int[m + 1][n + 1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
prefix[i][j] = matrix[i - 1][j - 1]
+ prefix[i - 1][j]
+ prefix[i][j - 1]
- prefix[i - 1][j - 1];
}
}
}
public int sumRegion(int r1, int c1, int r2, int c2) {
return prefix[r2 + 1][c2 + 1]
- prefix[r1][c2 + 1]
- prefix[r2 + 1][c1]
+ prefix[r1][c1];
}
}
π Flagship Problems by Company
Problem | Company | Pattern | Difficulty |
---|---|---|---|
Subarray Sum Equals K | Google, Amazon | Prefix Sum + HashMap | Medium |
Range Sum Query Immutable | Amazon | Prefix Sum | Easy |
Corporate Flight Bookings | Google, Amazon | Difference Array | Medium |
Car Pooling | Amazon, Uber | Difference Array | Medium |
Range Sum Query 2D Immutable | Google, Microsoft | 2D Prefix | Medium |
Maximum Size Subarray Sum = k | Prefix + HashMap | Medium | |
Count Subarrays Divisible by K | Amazon | Prefix + Mod | Medium |
π§ Quick βPattern Recognitionβ Checklist
- Querying sum of subarray multiple times? β Prefix sum.
- Counting number of subarrays with condition? β Prefix sum + HashMap.
- Multiple range updates? β Difference array.
- Matrix queries? β 2D prefix sum.
π― Practice Set (Homework with Hints)
- Maximum Size Subarray Sum = K (Google) β Use prefix sum + earliest index.
- Count Subarrays Divisible by K (Amazon) β Store prefix % k in map.
- Car Pooling (Uber/Amazon) β Difference array + prefix check capacity.
- Range Addition (Google) β Classic diff array.
- 2D Range Sum Query (Google) β Build prefix 2D.
π Key Takeaway
Prefix sums & difference arrays transform problems from brute-force to linear time.
Whenever you see subarray, interval, or range update/query problems β this is your go-to pattern.
π
Coming Up β Day 4:
π Sliding Window + Variable Window Sizes (super hot in FAANG interviews).
Top comments (0)