Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LeetCode] 1253. Reconstruct a 2-Row Binary Matrix #1253

Open
grandyang opened this issue May 30, 2019 · 0 comments
Open

[LeetCode] 1253. Reconstruct a 2-Row Binary Matrix #1253

grandyang opened this issue May 30, 2019 · 0 comments

Comments

@grandyang
Copy link
Owner

grandyang commented May 30, 2019

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 同步地址:

#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 打赏


---|---

@grandyang grandyang changed the title [LeetCode] 1253. Missing Problem [LeetCode] 1253. Reconstruct a 2-Row Binary Matrix Nov 26, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant