[LeetCode] 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 or 1.
  • 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], where colsum is given as an integer array with length n.

Your task is to reconstruct the matrix with upperlower 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 }

JavaScript实现

 1 /**
 2  * @param {number} upper
 3  * @param {number} lower
 4  * @param {number[]} colsum
 5  * @return {number[][]}
 6  */
 7 var reconstructMatrix = function (upper, lower, colsum) {
 8     // corner case
 9     let sum = 0;
10     for (let i = 0; i < colsum.length; i++) {
11         sum += colsum[i];
12     }
13     if (upper + lower < sum) {
14         return [];
15     }
16 
17     // normal case
18     let res = [...Array(2)].map(() => Array(colsum.length).fill(0));
19     for (let i = 0; i < colsum.length; i++) {
20         if (colsum[i] == 2 || (colsum[i] == 1 && upper > lower)) {
21             res[0][i] = 1;
22             upper--;
23         }
24         if (colsum[i] == 2 || (colsum[i] == 1 && res[0][i] == 0)) {
25             res[1][i] = 1;
26             lower--;
27         }
28     }
29     if (upper == 0 && lower == 0) {
30         return res;
31     }
32     return [];
33 };

相关题目

1253. Reconstruct a 2-Row Binary Matrix

1605. Find Valid Matrix Given Row and Column Sums

LeetCode 题目总结

原文地址:https://www.cnblogs.com/cnoodle/p/14191335.html