problemmediumalgorithmsleetcode-3546leetcode 3546leetcode3546

Equal Sum Grid Partition I

MediumUpdated: Aug 2, 2025
Practice on:

Problem

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:

  • Each of the two resulting sections formed by the cut is non-empty.
  • The sum of the elements in both sections is equal.

Return true if such a partition exists; otherwise return false.

Examples

Example 1

\Huge \begin{array}{|c|c|} \hline 1 & 4 \\\ \hline 2 & 3 \\\ \hline \end{array}$$ ```d 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 ```d 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 <= 10^5` * `1 <= n == grid[i].length <= 10^5` * `2 <= m * n <= 10^5` * `1 <= grid[i][j] <= 10^5` ## Solution ### Method 1 – Prefix Sum and Cut Check #### Intuition If we want to split the grid into two non-empty parts with equal sums using a single horizontal or vertical cut, we can precompute the total sum and check for each possible cut if the sum of one part equals half the total sum. #### Approach 1. Compute the total sum of all elements in the grid. 2. For each possible horizontal cut (between row i and i+1), compute the sum of the top part using prefix sums. If it equals half the total, return true. 3. For each possible vertical cut (between column j and j+1), compute the sum of the left part using prefix sums. If it equals half the total, return true. 4. If no such cut exists, return false. #### Code {{< code_tabs >}} ##### C++ ```cpp class Solution { public: bool isPossibleToCutGrid(vector<vector<int>>& grid) { int m = grid.size(), n = grid[0].size(); long long total = 0; for (auto& row : grid) for (int x : row) total += x; long long row_sum = 0; for (int i = 0; i < m - 1; ++i) { for (int x : grid[i]) row_sum += x; if (row_sum * 2 == total) return true; } for (int j = 0; j < n - 1; ++j) { long long col_sum = 0; for (int i = 0; i < m; ++i) col_sum += grid[i][j]; if (col_sum * 2 == total) return true; } return false; } }; ``` ##### Java ```java class Solution { public boolean isPossibleToCutGrid(int[][] grid) { int m = grid.length, n = grid[0].length; long total = 0; for (int[] row : grid) for (int x : row) total += x; long rowSum = 0; for (int i = 0; i < m - 1; ++i) { for (int x : grid[i]) rowSum += x; if (rowSum * 2 == total) return true; } for (int j = 0; j < n - 1; ++j) { long colSum = 0; for (int i = 0; i < m; ++i) colSum += grid[i][j]; if (colSum * 2 == total) return true; } return false; } } ``` ##### Python ```python class Solution: def isPossibleToCutGrid(self, grid: list[list[int]]) -> bool: m, n = len(grid), len(grid[0]) total = sum(sum(row) for row in grid) row_sum = 0 for i in range(m - 1): row_sum += sum(grid[i]) if row_sum * 2 == total: return True for j in range(n - 1): col_sum = 0 for i in range(m): col_sum += grid[i][j] if col_sum * 2 == total: return True return False ``` {{< /code_tabs >}} #### Complexity - ⏰ Time complexity: `O(mn)`, since we may sum all elements for each possible cut. - 🧺 Space complexity: `O(1)`, only a few variables for sums.

Comments