Untitled
unknown
plain_text
3 days ago
1.6 kB
1
Indexable
class Solution { public int[][] matrixBlockSum(int[][] mat, int k) { int m = mat.length; int n = mat[0].length; // Step 1: Build the prefix sum matrix int[][] prefixSum = new int[m][n]; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { prefixSum[i][j] = mat[i][j]; if (i > 0) prefixSum[i][j] += prefixSum[i - 1][j]; // Add sum from above if (j > 0) prefixSum[i][j] += prefixSum[i][j - 1]; // Add sum from left if (i > 0 && j > 0) prefixSum[i][j] -= prefixSum[i - 1][j - 1]; // Remove overlap } } // Step 2: Compute the result matrix int[][] answer = new int[m][n]; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { // Determine the bounds of the window int r1 = Math.max(0, i - k); // Top row int c1 = Math.max(0, j - k); // Left column int r2 = Math.min(m - 1, i + k); // Bottom row int c2 = Math.min(n - 1, j + k); // Right column // Calculate the sum of the window using the prefix sum matrix answer[i][j] = prefixSum[r2][c2]; if (r1 > 0) answer[i][j] -= prefixSum[r1 - 1][c2]; // Subtract top region if (c1 > 0) answer[i][j] -= prefixSum[r2][c1 - 1]; // Subtract left region if (r1 > 0 && c1 > 0) answer[i][j] += prefixSum[r1 - 1][c1 - 1]; // Add back overlap } } return answer; } }
Editor is loading...
Leave a Comment