Skip to content

Commit de6e128

Browse files
Create 1605. 给定行和列的和求可行矩阵.md
1 parent 7e66705 commit de6e128

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#### 1605. 给定行和列的和求可行矩阵
2+
3+
难度:中等
4+
5+
---
6+
7+
给你两个非负整数数组 `rowSum` 和 `colSum` ,其中 `rowSum[i]` 是二维矩阵中第 `i` 行元素的和, `colSum[j]` 是第 `j` 列元素的和。换言之你不知道矩阵里的每个元素,但是你知道每一行和每一列的和。
8+
9+
请找到大小为 `rowSum.length x colSum.length` 的任意 **非负整数**  矩阵,且该矩阵满足 `rowSum` 和 `colSum` 的要求。
10+
11+
请你返回任意一个满足题目要求的二维矩阵,题目保证存在 **至少一个**  可行矩阵。
12+
13+
**示例 1:**
14+
15+
```
16+
输入:rowSum = [3,8], colSum = [4,7]
17+
输出:[[3,0],
18+
[1,7]]
19+
解释:
20+
第 0 行:3 + 0 = 3 == rowSum[0]
21+
第 1 行:1 + 7 = 8 == rowSum[1]
22+
第 0 列:3 + 1 = 4 == colSum[0]
23+
第 1 列:0 + 7 = 7 == colSum[1]
24+
行和列的和都满足题目要求,且所有矩阵元素都是非负的。
25+
另一个可行的矩阵为:[[1,2],
26+
[3,5]]
27+
```
28+
29+
**示例 2:**
30+
31+
```
32+
输入:rowSum = [5,7,10], colSum = [8,6,8]
33+
输出:[[0,5,0],
34+
[6,1,0],
35+
[2,0,8]]
36+
```
37+
38+
**示例 3:**
39+
40+
```
41+
输入:rowSum = [14,9], colSum = [6,9,8]
42+
输出:[[0,9,5],
43+
[6,0,3]]
44+
```
45+
46+
**示例 4:**
47+
48+
```
49+
输入:rowSum = [1,0], colSum = [1]
50+
输出:[[1],
51+
[0]]
52+
```
53+
54+
**示例 5:**
55+
56+
```
57+
输入:rowSum = [0], colSum = [0]
58+
输出:[[0]]
59+
```
60+
61+
**提示:**
62+
63+
* `1 <= rowSum.length, colSum.length <= 500`
64+
* `0 <= rowSum[i], colSum[i] <= 10^8`
65+
* `sum(rowSum) == sum(colSum)`
66+
67+
---
68+
69+
贪心:
70+
71+
运筹学中的运输问题。答案不唯一。有西北角法、最小元素法等,以下是西北角法的代码,即从**左上角**开始分配。
72+
73+
```Java
74+
class Solution {
75+
public int[][] restoreMatrix(int[] rowSum, int[] colSum) {
76+
int i = 0, j = 0;
77+
int[][] ans = new int[rowSum.length][colSum.length];
78+
while(i < rowSum.length && j < colSum.length){
79+
int temp = Math.min(rowSum[i], colSum[j]);
80+
ans[i][j] = temp;
81+
rowSum[i] -= temp;
82+
colSum[j] -= temp;
83+
if(rowSum[i] == 0) i++;
84+
if(colSum[j] == 0) j++;
85+
}
86+
return ans;
87+
}
88+
}
89+
```

0 commit comments

Comments
 (0)