Date: 11-09-2025 Time: 00:26
https://leetcode.com/problems/brick-wall/description/
Prefix Sum Approach
Core Idea: Use prefix sums to find all edge positions in each row, then find the position with the most edges across all rows.
🚀 Optimal Solution
class Solution {
public:
int leastBricks(vector<vector<int>>& wall) {
unordered_map<long long, int> edgeCount; // position -> count of edges
int n = wall.size();
// For each row, calculate prefix sums to find edge positions
for(int i = 0; i < n; i++) {
long long prefixSum = 0;
// Process all bricks except the last one (avoid wall boundary)
for(int j = 0; j < wall[i].size() - 1; j++) {
prefixSum += wall[i][j]; // Cumulative width = edge position
edgeCount[prefixSum]++; // Count this edge position
}
}
// Find position with maximum edges
int maxEdges = 0;
for(auto& pair : edgeCount) {
maxEdges = max(maxEdges, pair.second);
}
// Minimum crossed bricks = Total rows - Maximum edges at any position
return n - maxEdges;
}
};
Step-by-Step Example
Input: wall = [[1,2,2,1],[3,1,2],[1,3,2],[2,4],[3,1,2],[1,3,1,1]]
Step 1: Calculate Prefix Sums (Edge Positions)
Row 0: [1,2,2,1]
prefixSum = 0
j=0: prefixSum = 0 + 1 = 1 → edgeCount[1]++
j=1: prefixSum = 1 + 2 = 3 → edgeCount[3]++
j=2: prefixSum = 3 + 2 = 5 → edgeCount[5]++
// Skip last brick to avoid wall boundary
Edge positions: [1, 3, 5]
Row 1: [3,1,2]
prefixSum = 0
j=0: prefixSum = 0 + 3 = 3 → edgeCount[3]++
j=1: prefixSum = 3 + 1 = 4 → edgeCount[4]++
Edge positions: [3, 4]
Row 2: [1,3,2]
prefixSum = 0
j=0: prefixSum = 0 + 1 = 1 → edgeCount[1]++
j=1: prefixSum = 1 + 3 = 4 → edgeCount[4]++
Edge positions: [1, 4]
Row 3: [2,4]
prefixSum = 0
j=0: prefixSum = 0 + 2 = 2 → edgeCount[2]++
Edge positions: [2]
Row 4: [3,1,2]
prefixSum = 0
j=0: prefixSum = 0 + 3 = 3 → edgeCount[3]++
j=1: prefixSum = 3 + 1 = 4 → edgeCount[4]++
Edge positions: [3, 4]
Row 5: [1,3,1,1]
prefixSum = 0
j=0: prefixSum = 0 + 1 = 1 → edgeCount[1]++
j=1: prefixSum = 1 + 3 = 4 → edgeCount[4]++
j=2: prefixSum = 4 + 1 = 5 → edgeCount[5]++
Edge positions: [1, 4, 5]
Step 2: Count Edge Frequencies
edgeCount[1] = 2 (appears in rows 0, 2, 5)
edgeCount[2] = 1 (appears in row 3)
edgeCount[3] = 3 (appears in rows 0, 1, 4)
edgeCount[4] = 4 (appears in rows 1, 2, 4, 5) ← Maximum!
edgeCount[5] = 2 (appears in rows 0, 5)
Step 3: Calculate Result
maxEdges = 4 (at position 4)
totalRows = 6
minimumCrossedBricks = 6 - 4 = 2
Why Prefix Sum Works
- Edge Detection: Prefix sum gives exact positions where bricks end (edges occur)
- Frequency Counting: Count how many rows have an edge at each position
- Optimal Position: Position with most edges = position that crosses fewest bricks
- Direct Calculation:
crossedBricks = totalRows - edgesAtBestPosition
Complexity Analysis
- Time: O(n × m) where n = rows, m = average bricks per row
- Space: O(W) where W = total width of the wall (for storing edge positions)