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;
}
};