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 行二进制矩阵。
给你一个 2 行 n 列的二进制数组:
矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1。
第 0 行的元素之和为 upper。
第 1 行的元素之和为 lower。
第 i 列(从 0 开始编号)的元素之和为 colsum[i],colsum 是一个长度为 n 的整数数组。
你需要利用 upper,lower 和 colsum 来重构这个矩阵,并以二维整数数组的形式返回它。如果有多个不同的答案,那么任意一个都可以通过本题。
如果不存在符合要求的答案,就请返回一个空的二维数组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reconstruct-a-2-row-binary-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路是贪心。题意不难理解,重点在于怎么拼凑出最后的矩阵。
对于每一个 colsum[i] ,如果 colsum[i] == 2,那么自然是矩阵当前列,上下各有一个1
如果 colsum[i] == 0,那么自然是矩阵当前列,上下各有一个1
如果colsum[i] == 1,如果lower < upper,说明upper更多,可以试着放在上面一行;反之可以放在下面一行。这也就是这道题需要贪心的地方。
时间O(n)
空间O(n)
Java实现
1 class Solution { 2 public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) { 3 List<List<Integer>> res = new ArrayList<>(); 4 // corner case 5 int sum = 0; 6 for (int col : colsum) { 7 sum += col; 8 } 9 if (upper + lower < sum) { 10 return res; 11 } 12 13 // normal case 14 Integer[][] matrix = new Integer[2][colsum.length]; 15 for (int i = 0; i < 2; i++) { 16 for (int j = 0; j < colsum.length; j++) { 17 matrix[i][j] = 0; 18 } 19 } 20 21 for (int i = 0; i < colsum.length; i++) { 22 if (colsum[i] == 2 || (colsum[i] == 1 && upper > lower)) { 23 matrix[0][i] = 1; 24 } 25 if (colsum[i] == 2 || (colsum[i] == 1 && matrix[0][i] == 0)) { 26 matrix[1][i] = 1; 27 } 28 upper -= matrix[0][i] == 1 ? 1 : 0; 29 lower -= matrix[1][i] == 1 ? 1 : 0; 30 } 31 if (upper == 0 && lower == 0) { 32 res.add(Arrays.asList(matrix[0])); 33 res.add(Arrays.asList(matrix[1])); 34 } 35 return res; 36 } 37 }