zoukankan      html  css  js  c++  java
  • [LeetCode] 1253. Reconstruct a 2Row Binary Matrix 重构 2 行二进制矩阵


    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 by n 的数组,且只含有0和1两个数字,现在知道第一行的数字和为 upper,第二行的数字和为 lower,且各列的数字和在数组 colsum 中,现在让重建这个数组,若无法重建,则返回空数组。由于原数组中只有0和1,而且只有两行,则每一列的和只有三种情况,0,1,和2。其中0和2的情况最简单,上下两个位置分别只能为0和1,只有当列和为1的时候,才会有不确定性,不知道到底是上面的数字为1还是下面的数字为1。这个时候其实可以使用贪婪算法的思想,判断的依据是此时的 upper 和 lower 的值,当 upper 大于 lower 时,就让上面的数字为1,否则就让下面的数字为1。

    这种贪婪算法可以在有解的情况下得到一个合法解,因为这道题没有让返回所有的合法的解。明白了思路,代码就不难写了,遍历每一列,先更新上位数字,若当前列之和为2,则上位数字一定是1,或者列之和为1,且 uppper 大于 lower 的时候,上位数字也是1。再来更新下位数字,若当前列之和为2,则下位数字一定是1,或者列之和为1,且此时上位数字是0的话,则下位数字是1。最后别忘了 upper 和 lower 分别减去当前的上位和下位数字。最后返回的时候判断,若 upper 和 lower 同时为0了,则返回 res,否则返回空数组即可,参见代码如下:


    class Solution {
    public:
        vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {
            vector<vector<int>> res(2, vector<int>(colsum.size()));
            for (int i = 0; i < colsum.size(); ++i) {
                res[0][i] = colsum[i] == 2 || (colsum[i] == 1 && upper > lower);
                res[1][i] = colsum[i] == 2 || (colsum[i] == 1 && !res[0][i]);
                upper -= res[0][i];
                lower -= res[1][i];
            }
            return upper == 0 && lower == 0 ? res : vector<vector<int>>();
        }
    };
    

    Github 同步地址:

    https://github.com/grandyang/leetcode/issues/1253


    类似题目:

    Find Valid Matrix Given Row and Column Sums


    参考资料:

    https://leetcode.com/problems/reconstruct-a-2-row-binary-matrix/

    https://leetcode.com/problems/reconstruct-a-2-row-binary-matrix/discuss/425793/C%2B%2BJava-5-lines


    LeetCode All in One 题目讲解汇总(持续更新中...)


    喜欢请点赞,疼爱请打赏❤️~.~


    微信打赏


    Venmo 打赏

  • 相关阅读:
    apache安全—用户访问控制
    hdu 3232 Crossing Rivers 过河(数学期望)
    HDU 5418 Victor and World (可重复走的TSP问题,状压dp)
    UVA 11020 Efficient Solutions (BST,Splay树)
    UVA 11922 Permutation Transformer (Splay树)
    HYSBZ 1208 宠物收养所 (Splay树)
    HYSBZ 1503 郁闷的出纳员 (Splay树)
    HDU 5416 CRB and Tree (技巧)
    HDU 5414 CRB and String (字符串,模拟)
    HDU 5410 CRB and His Birthday (01背包,完全背包,混合)
  • 原文地址:https://www.cnblogs.com/grandyang/p/15550598.html
Copyright © 2011-2022 走看看