校园微信网站模板,做百度网站接到多少客户电话号码,广州有几个区 分别叫什么,网络建站东北题目描述给你一个 2 行 n 列的二进制数组#xff1a;矩阵是一个二进制矩阵#xff0c;这意味着矩阵中的每个元素不是 0 就是 1。第 0 行的元素之和为 upper。第 1 行的元素之和为 lower。第 i 列#xff08;从 0 开始编号#xff09;的元素之和为 colsum[i]#xff0c;col…题目描述给你一个 2 行 n 列的二进制数组矩阵是一个二进制矩阵这意味着矩阵中的每个元素不是 0 就是 1。第 0 行的元素之和为 upper。第 1 行的元素之和为 lower。第 i 列从 0 开始编号的元素之和为 colsum[i]colsum 是一个长度为 n 的整数数组。你需要利用 upperlower 和 colsum 来重构这个矩阵并以二维整数数组的形式返回它。如果有多个不同的答案那么任意一个都可以通过本题。如果不存在符合要求的答案就请返回一个空的二维数组。示例 1输入upper 2, lower 1, colsum [1,1,1]
输出[[1,1,0],[0,0,1]]
解释[[1,0,1],[0,1,0]] 和 [[0,1,1],[1,0,0]] 也是正确答案。示例 2输入upper 2, lower 3, colsum [2,2,1,1]
输出[]示例 3输入upper 5, lower 5, colsum [2,1,2,0,1,0,1,2,0,1]
输出[[1,1,1,0,1,0,0,1,0,0],[1,0,1,0,0,0,1,1,0,1]]提示1 colsum.length 10^50 upper, lower colsum.length0 colsum[i] 2解题思路[1]使用贪心算法大致思路为若 colsum[i]2colsum[i]2则 一定上下均为 1若 colsum[i]0colsum[i]0则 一定上下均为 0若 colsum[i]1colsum[i]1则 上下一个 1 一个 0。唯一需要讨论的只有 colsum[i]1colsum[i]1 的情形我们可以规定在把2分配完之后先分配上为 1再分配下为 1。代码如下代码有点长但是思路很容易看懂class Solution {
public:vectorvectorint reconstructMatrix(int upper, int lower, vectorint colsum) {int lengthcolsum.size(),sum0;vector vectorint res;for(int i0;ilength;i){if(colsum[i]2)//为2时上下均需要分配1此时lower和upper需要减去分配的1{lower--;upper--;}else if(colsum[i]1)sum1;}//总数不相符合或者上下某一行的数不符合则返回空vectorif(sum!lowerupper || lower0 || upper0)return res;vectorint a1,a2;for(int i0;ilength;i){if(colsum[i]2){a1.push_back(1);a2.push_back(1);}else if(colsum[i]0){a1.push_back(0);a2.push_back(0);}else//colsum[i]1{if(upper0)//上1下0{a1.push_back(1);a2.push_back(0);upper--;}else if(lower0)//上0下1{a1.push_back(0);a2.push_back(1);lower--;}elsereturn res;}}res.push_back(a1);res.push_back(a2);return res;}
};
提交结果参考^https://leetcode-cn.com/problems/reconstruct-a-2-row-binary-matrix/solution/java-tan-xin-suan-fa-xiang-jie-by-amanehayashi/