Watch 10 video solutions for Find Valid Matrix Given Row and Column Sums, a medium level problem involving Array, Greedy, Matrix. This walkthrough by NeetCodeIO has 11,275 views views. Want to try solving it yourself? Practice on FleetCode or read the detailed text solution.
You are given two arrays rowSum and colSum of non-negative integers where rowSum[i] is the sum of the elements in the ith row and colSum[j] is the sum of the elements of the jth column of a 2D matrix. In other words, you do not know the elements of the matrix, but you do know the sums of each row and column.
Find any matrix of non-negative integers of size rowSum.length x colSum.length that satisfies the rowSum and colSum requirements.
Return a 2D array representing any matrix that fulfills the requirements. It's guaranteed that at least one matrix that fulfills the requirements exists.
Example 1:
Input: rowSum = [3,8], colSum = [4,7]
Output: [[3,0],
[1,7]]
Explanation:
0th row: 3 + 0 = 3 == rowSum[0]
1st row: 1 + 7 = 8 == rowSum[1]
0th column: 3 + 1 = 4 == colSum[0]
1st column: 0 + 7 = 7 == colSum[1]
The row and column sums match, and all matrix elements are non-negative.
Another possible matrix is: [[1,2],
[3,5]]
Example 2:
Input: rowSum = [5,7,10], colSum = [8,6,8]
Output: [[0,5,0],
[6,1,0],
[2,0,8]]
Constraints:
1 <= rowSum.length, colSum.length <= 5000 <= rowSum[i], colSum[i] <= 108sum(rowSum) == sum(colSum)Problem Overview: You receive two arrays: rowSum and colSum. The task is to construct any non‑negative matrix where each row adds up to rowSum[i] and each column adds up to colSum[j]. Multiple answers may exist; you only need to return one valid matrix.
Approach 1: Greedy Construction (O(m * n) time, O(1) extra space)
The cleanest solution uses a greedy strategy. Iterate through the matrix cell by cell. At position (i, j), assign the smallest possible value that does not violate the remaining row or column requirements: value = min(rowSum[i], colSum[j]). Place this value in the matrix, then subtract it from both rowSum[i] and colSum[j]. This works because every assignment satisfies both constraints locally while preserving feasibility for the remaining cells.
The key insight: if a row still needs r and a column still needs c, the maximum valid value you can place is min(r, c). Filling that amount never blocks future placements because both totals remain non‑negative. Continue iterating across columns for each row until all sums become zero. This approach leverages simple arithmetic and works efficiently with standard array traversal.
Since each cell is visited once, the time complexity is O(m * n), where m is the number of rows and n is the number of columns. Only the output matrix is stored, so auxiliary space remains O(1). This pattern is a classic greedy construction on a matrix.
Approach 2: Network Flow Formulation (O(V * E) typical)
The problem can also be modeled as a flow network. Create a source node connected to each row node with capacity rowSum[i]. Connect each column node to a sink with capacity colSum[j]. Add edges from every row node to every column node with infinite capacity. Running a max‑flow algorithm distributes flow values that correspond to the matrix entries.
This formulation guarantees correctness because flow conservation ensures row and column totals match the required sums. However, it introduces unnecessary overhead compared to the greedy construction. Implementations using Dinic or Edmonds‑Karp are significantly heavier and slower for typical constraints.
Recommended for interviews: The greedy approach is the expected answer. It shows you recognize that each cell can safely take min(rowSum[i], colSum[j]) without violating global constraints. Mentioning the flow interpretation demonstrates deeper understanding, but implementing the greedy solution quickly signals strong problem‑solving instincts.
| Approach | Time | Space | When to Use |
|---|---|---|---|
| Greedy Matrix Construction | O(m * n) | O(1) extra | Best general solution. Simple implementation and optimal for interview settings. |
| Network Flow (Max Flow) | O(V * E) typical | O(V + E) | Useful for theoretical understanding or when extending to more complex constraints. |