• [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 题目总结

  • 相关阅读:
    记录JavaScript的util.js类库
    Shiro登录中遇到了问题
    【转载】JavaScript导出Excel
    react-router
    react 表单
    html5定位getLocation()
    html5存储方式localstorage和sessionStorage
    position导致Safari工具栏不自动隐藏
    input type="datetime-local" 时placeholder不显示
    vuex(1.0版本写法)
  • 原文地址:https://www.cnblogs.com/cnoodle/p/14191335.html
Copyright © 2020-2023  润新知