用 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
  • 如果 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, ],]

更新於:2020年5月2日

173 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.