用 C++ 重构一个二行二元矩阵
假设我们有如下具有 n 列和 2 行的矩阵的详细信息:
- 矩阵元素将是 0 或 1
- 第 0 行(上行)元素的总和为 upper。
- 第 1 行(下行)元素的总和为 lower。
- 第 i 列(从 0 开始索引)的元素总和为 colsum[i],其中 colsum 是一个长度为 n 的整数数组。
任务是使用 upper、lower 和 colsum 重构矩阵。我们必须将其作为一个二维整数数组找到。如果有多个有效解,则接受任何一个。如果没有有效解,则返回一个空二维数组。因此,如果输入类似于 upper = 2,lower = 3,而 colsum 为 [1,1,1],则输出将为 [[1,1,0],[0,0,1]]
为了解决这个问题,我们将遵循以下步骤:
- 设置 flag := true,n := c 的大小,创建一个大小为 2 * n 的数组 ans
- 对于 i 从 0 到 n 的范围
- 如果 c[i] = 2,则
- 将 u 和 l 各减少 1
- 如果 u < 0 或 l < 0,则 flag := false
- 设置 ans[0, i] = 1 和 ans[1, i] = 1
- 否则如果 c[i] = 1,则
- 如果 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
- 否则设置 flag := false
- 否则 c[i] = 0
- 如果 c[i] > 0,则设置 flag := false
- 否则设置 flag := false
- 如果 c[i] = 2,则
- 如果 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, ],]
广告