首页 文章资讯内容详情

在C ++中重建2行二进制矩阵

2026-06-04 1 花语

假设我们具有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, ],]