在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减小1ans[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)); }
输入值
2 1 [1,1,1]
输出结果
[[1, 1, 0, ],[0, 0, 1, ],]