就按照朴素的想法一个个填矩阵的元素就好了,实际上这是一种贪心的思想。
- 首先根据
colsum,把和是2的列填出来(和是2,代表该列的两行元素肯定都是1)。填完之后把colsum该列的和设置为 0,表达我们已经处理过这一列了。upper,lower的值也要记得更新,自身要减一,因为每一行都填了一个1了。 - 其次再处理
colsum中值是1的元素,有这些情况- 首先检查第一行该列能否填
1,即upper > 0。如果满足条件,该位置填入1,然后upper减一,处理下一个colsum中值是1的元素 - 如果不满足
upper > 0,检查第二行的该列能否填1,即lower > 0。如果满足条件,该位置填入1,然后lower减一,处理下一个colsum中值是1的元素 - 最后如果上述两个情况都不存在,说明不存在符合要求的答案,最终结果就是空数组
- 首先检查第一行该列能否填
边界条件
边界条件要特别注意,主要关注以下这些点
- 处理完所有
colsum中值是2的元素后,检查upper,lower是否变成负数了,如果任意一个变成负数了,说明不存在符合要求的答案 - 处理完所有
colsum中值是1的元素后,检查upper,lower是否全是0,如果任意一个不是0,这也说明不存在符合要求的答案
class Solution {
public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) {
int col = colsum.length;
int[][] ans = new int[2][col];
for (int i = 0; i < col; ++i) {
if (colsum[i] == 2) {
ans[0][i] = ans[1][i] = 1;
colsum[i] = 0;
upper--;
lower--;
}
}
if (upper < 0 || lower < 0) {
return Collections.emptyList();
}
boolean noAns = false;
for (int i = 0; i < col; ++i) {
if (colsum[i] == 1) {
if (upper > 0) {
ans[0][i] = 1;
upper--;
} else if (lower > 0) {
ans[1][i] = 1;
lower--;
} else {
noAns = true;
break;
}
}
}
if (noAns || (upper != 0 || lower != 0)) {
return Collections.emptyList();
} else {
List<List<Integer>> ansList = new ArrayList<>();
for (int[] row : ans) {
List<Integer> rowList = new ArrayList<>();
for (int x : row) {
rowList.add(x);
}
ansList.add(rowList);
}
return ansList;
}
}
}