在C ++中重建2行二进制矩阵
假设我们具有n列2行的矩阵的以下详细信息-
矩阵元素将为0或1
第0(上)行的元素总和作为上限给出。
第1个(较低)行的元素总和较小。
第i列(索引为0)中的元素之和为colsum [i],其中colsum作为长度为n的整数数组给出。
任务是用上,下和求和重建矩阵。我们必须找到它作为2D整数数组。如果有多个有效解决方案,则将接受其中任何一个。如果没有有效的解决方案,则返回一个空的2D数组。因此,如果输入像上= 2,下= 3并且colsum是[1,1,1],那么输出将是[[1,1,0],[0,0,1]]
为了解决这个问题,我们将遵循以下步骤-
设置标志:= true,n:= c的大小,使一个数组ans的顺序为2 * n
当我在0到n的范围内
如果c [i]> 0,则设置标志:= false
如果u> l,则将u减1,ans [0,i]:= 1
否则,当u <l时,将l减小1 ans [1,i]:= 1
否则当c [i] = 1时
如果u> 0,则将u减1,然后ans [0,i]:= 1
否则l> 0,然后将l减1,然后ans [1,i]:= 1
否则设置标志:= false
将u和l减1
如果u <0或l <0,则标志:= false
将ans [0,i] = 1和ans [1,i] = 1
如果c [i] = 2,则
否则,如果c [i] = 1,则
否则c [i] = 0
否则设置标志:= false
如果flag为false或u不为0或l不为0,则返回空
返回ans
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h>using namespace std;
void print_vector(vector<vector<auto> > v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << "[";
for(int j = 0; j <v[i].size(); j++){
cout << v[i][j] << ", ";
}
cout << "],";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<vector<int>> reconstructMatrix(int u, int l, vector<int>& c) {
bool flag = true;
int n = c.size();
vector < vector <int> > ans(2, vector <int> (n));
for(int i = 0; i < n; i++){
if(c[i] == 2){
u--;
l--;
if(u<0 || l<0)flag = false;
ans[0][i] = 1;
ans[1][i] = 1;
}else if(c[i] == 1){
if(u>l){
u--;
ans[0][i] = 1;
}else if(u<l){
l--;
ans[1][i] = 1;
}else{
if(u>0){
u--;
ans[0][i] = 1;
}else if(l > 0){
l--;
ans[1][i] = 1;
}else
flag = false;
}
}else if(c[i] == 0){
if(c[i]>0)flag = false;
}else{
flag = false;
}
}
if(!flag || u!=0 ||l!=0 )return {};
return ans;
}
};
main(){
vector<int> v = {1,1,1};
Solution ob;
print_vector(ob.reconstructMatrix(2,1,v));
}
输入值
21
[1,1,1]
输出结果
[[1, 1, 0, ],[0, 0, 1, ],]
以上是 在C ++中重建2行二进制矩阵 的全部内容, 来源链接: utcz.com/z/362189.html