We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
Given the following details of a matrix with n columns and 2 rows :
n
2
0
1
upper
lower
colsum[i]
colsum
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 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 打赏
---|---
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Given the following details of a matrix with
n
columns and2
rows :0
or1
.upper
.lower
.colsum[i]
, wherecolsum
is given as an integer array with lengthn
.Your task is to reconstruct the matrix with
upper
,lower
andcolsum
.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:
Example 2:
Example 3:
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,否则返回空数组即可,参见代码如下:
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 打赏
---|---
The text was updated successfully, but these errors were encountered: