题目地址:
https://leetcode.com/problems/reconstruct-a-2-row-binary-matrix/description/
要求以给定信息,构造一个只含数字
0
,
1
0,1
0,1的
2
×
n
2\times n
2×n的矩阵。信息如下:
1、第一行的和
u
u
u,第二行的和
l
l
l;
2、每一列的和。
无解则返回空数组。
如果某一列的和为 2 2 2,那我们已经知道了这一列两个数字都是 1 1 1;如果某一列的和为 0 0 0,则两个数都是 0 0 0;否则的话,我们先尝试用掉 u u u次将第一行数字变 1 1 1的机会,再用 l l l次将第二行数字变为 1 1 1的机会。最后看一下是否符合要求即可。代码如下:
class Solution {
public:
vector<vector<int>> reconstructMatrix(int up, int low, vector<int>& cs) {
int n = cs.size();
vector<vector<int>> res(2, vector<int>(n));
for (int i = 0; i < n; i++)
if (cs[i] == 2) {
res[0][i] = res[1][i] = 1;
up--;
low--;
}
// up和low已经不够用了,说明无解
if (up < 0 || low < 0) return vector<vector<int>>();
// 改第一行
for (int i = 0; i < n; i++)
if (up && cs[i] == 1 && res[0][i] + res[1][i] == 0) {
res[0][i] = 1;
up--;
}
// 改第二行
for (int i = 0; i < n; i++)
if (low && cs[i] == 1 && res[0][i] + res[1][i] == 0) {
res[1][i] = 1;
low--;
}
// up和low余额没用光,说明无解
if (up || low) return vector<vector<int>>();
// 最后验证一下
for (int i = 0; i < n; i++)
if (res[0][i] + res[1][i] != cs[i]) return vector<vector<int>>();
return res;
}
};
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。