1605. 给定行和列的和求可行矩阵
给你两个非负整数数组 rowSum 和 colSum ,其中 rowSumi 是二维矩阵中第 i 行元素的和, colSumj 是第 j 列元素的和。换言之你不知道矩阵里的每个元素,但是你知道每一行和每一列的和。
请找到大小为 rowSum.length x colSum.length 的任意 非负整数 矩阵,且该矩阵满足 rowSum 和 colSum 的要求。
请你返回任意一个满足题目要求的二维矩阵,题目保证存在 至少一个 可行矩阵。
示例 1:
输入:rowSum = 3,8, colSum = 4,7
输出:\[3,0,
1,7\]
示例 2:
输入:rowSum = 5,7,10, colSum = 8,6,8
输出:\[0,5,0,
6,1,0,
2,0,8\]
示例 3:
输入:rowSum = 14,9, colSum = 6,9,8
输出:\[0,9,5,
6,0,3\]
示例 4:
输入:rowSum = 1,0, colSum = 1
输出:\[1,
0\]
示例 5:
输入:rowSum = 0, colSum = 0
输出:\[0]
提示:
1 <= rowSum.length, colSum.length <= 500
0 <= rowSumi, colSumi <= 108
sum(rowSum) == sum(colSum)
1、贪心算法。
go
// 左上角开始遍历,使用贪心算法,每次寻找行和列最小的值
func restoreMatrix(rowSum []int, colSum []int) [][]int {
n, m := len(rowSum), len(colSum)
res := make([][]int, n)
for i := 0; i < n; i++ {
res[i] = make([]int, m)
}
for i, j := 0, 0; i < m && j < n; {
rs, cs := rowSum[i], colSum[j]
// 贪心算法
// 尽管标记比较小的元素,其他地方不填写默认为0
if rs < cs {
res[i][j] = rs
colSum[j] -= rs
i++
} else {
res[i][j] = cs
rowSum[i] -= cs
j++
}
}
return res
}