1253. Reconstruct a 2-Row Binary Matrix
Given the following details of a matrix with n
columns and 2
rows :
- The matrix is a binary matrix, which means each element in the matrix can be
0
or1
. - The sum of elements of the 0-th(upper) row is given as
upper
. - The sum of elements of the 1-st(lower) row is given as
lower
. - The sum of elements in the i-th column(0-indexed) is
colsum[i]
, wherecolsum
is given as an integer array with lengthn
.
Your task is to reconstruct the matrix with upper
, lower
and colsum
.
Return it as a 2-D integer array.
If there are more than one valid solution, any of them will be accepted.
If no valid solution exists, return an empty 2-D array.
Example 1:
Input: upper = 2, lower = 1, colsum = [1,1,1]
Output: [[1,1,0],[0,0,1]]
Explanation: [[1,0,1],[0,1,0]], and [[0,1,1],[1,0,0]] are also correct answers.
Example 2:
Input: upper = 2, lower = 3, colsum = [2,2,1,1]
Output: []
Example 3:
Input: upper = 5, lower = 5, colsum = [2,1,2,0,1,0,1,2,0,1]
Output: [[1,1,1,0,1,0,0,1,0,0],[1,0,1,0,0,0,1,1,0,1]]
Constraints:
1 <= colsum.length <= 10^5
0 <= upper, lower <= colsum.length
0 <= colsum[i] <= 2
题目:给你一个2行n列的二进制数组:
- 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是0就是1。
- 第0行的元素之和为 upper。
- 第1行的元素之和为 lower。
- 第i列(从0开始编号)的元素之和为
colsum[i]
,colsum
是一个长度为 n 的整数数组。 - 你需要利用
upper
,lower
和colsum
来重构这个矩阵,并以二维整数数组的形式返回它。
如果有多个不同的答案,那么任意一个都可以通过本题。如果不存在符合要求的答案,就请返回一个空的二维数组。
思路:贪心,参考Link。对于colsum[i]=2
的列,其返回的结果数组res[0][i]=res[1][i]
只能为1
;在第一行的和小于upper
的前提下,若colsum[i]=1
,使得res[0][i]=1
;同理处理第二行。
class Solution {
public:
vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {
int n = colsum.size();
vector<vector<int>> res(2, vector<int>(n, 0));
// 对列值为2的位置上下均置1
for (int i = 0; i < n; ++i) {
if (colsum[i] == 2) {
res[0][i] = 1;
res[1][i] = 1;
}
}
int upper_sum = accumulate(res[0].begin(), res[0].end(), 0);
for (int i = 0; i < n && upper_sum < upper; ++i) {
// 当前列的和为1,且此时第一行的和小于upper
if (colsum[i] == 1) {
res[0][i] = 1;
upper_sum += 1;
}
}
int lower_sum = accumulate(res[1].begin(), res[1].end(), 0);
for (int i = 0; i < n; ++i) {
if (colsum[i] == 1 && res[0][i] == 0) {
res[1][i] = 1;
lower_sum += 1;
}
}
if (upper_sum != upper || lower_sum != lower)
return {};
return res;
}
};