Medium
You are given an m x n
matrix grid
of positive integers. Your task is to determine if it is possible to make either one horizontal or one vertical cut on the grid such that:
Return true
if such a partition exists; otherwise return false
.
Example 1:
Input: grid = [[1,4],[2,3]]
Output: true
Explanation:
A horizontal cut between row 0 and row 1 results in two non-empty sections, each with a sum of 5. Thus, the answer is true
.
Example 2:
Input: grid = [[1,3],[2,4]]
Output: false
Explanation:
No horizontal or vertical cut results in two non-empty sections with equal sums. Thus, the answer is false
.
Constraints:
1 <= m == grid.length <= 105
1 <= n == grid[i].length <= 105
2 <= m * n <= 105
1 <= grid[i][j] <= 105
public class Solution {
public boolean canPartitionGrid(int[][] grid) {
int n = grid.length;
int m = grid[0].length;
long totalRowSum = 0L;
long totalColSum;
long[] prefixRowWise = new long[n];
long[] prefixColWise = new long[m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int v = grid[i][j];
prefixRowWise[i] += v;
prefixColWise[j] += v;
}
}
for (long r : prefixRowWise) {
totalRowSum += r;
}
totalColSum = totalRowSum;
long currentRowUpperSum = 0L;
for (int i = 0; i < n - 1; i++) {
currentRowUpperSum += prefixRowWise[i];
long lowerSegmentSum = totalRowSum - currentRowUpperSum;
if (currentRowUpperSum == lowerSegmentSum) {
return true;
}
}
long currentColLeftSum = 0L;
for (int j = 0; j < m - 1; j++) {
currentColLeftSum += prefixColWise[j];
long rightSegmentSum = totalColSum - currentColLeftSum;
if (currentColLeftSum == rightSegmentSum) {
return true;
}
}
return false;
}
}