在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));
    }

    输入值

    2
    1
    [1,1,1]

    输出结果

    [[1, 1, 0, ],[0, 0, 1, ],]