n개의 열과 2개의 행이 있는 행렬에 대한 다음 세부 정보가 있다고 가정합니다. -
- 행렬 요소는 0 또는 1입니다.
- 0번째(상단)행의 원소의 합을 상위로 한다.
- 첫 번째(하단) 행의 요소 합은 더 낮은 것으로 표시됩니다.
- i번째 열(0-인덱싱)에 있는 요소의 합은 colsum[i]이며, 여기서 colsum은 길이가 n인 정수 배열로 제공됩니다.
작업은 상위, 하위 및 colsum으로 행렬을 재구성하는 것입니다. 2D 정수 배열로 찾아야 합니다. 둘 이상의 유효한 솔루션이 있는 경우 그 중 하나가 허용됩니다. 유효한 솔루션이 없으면 빈 2D 배열을 반환합니다. 따라서 입력이 upper =2, lower =3이고 colsum이 [1,1,1]이면 출력은 [[1,1,0],[0,0,1]]
이 됩니다.이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- set flag :=true, n :=c의 크기, 2 * n의 순서로 하나의 배열을 만듭니다.
- 0~n
- 범위의 i에 대해
- c[i] =2이면
- u와 l을 1씩 감소
- u <0 또는 l <0이면 플래그 :=false
- Ans[0, i] =1 및 ans[1, i] =1
- c[i] =1이면
- u> l이면 u를 1만큼 감소, ans[0, i] :=1
- 그렇지 않으면 u
- 그렇지 않으면 c[i] =1일 때
- u> 0이면 u를 1로 줄이고 ans[0, i] :=1
- 그렇지 않으면 l> 0이면 l을 1로 줄이고 ans[1, i] :=1
- 그렇지 않으면 플래그 설정 :=false
- 그렇지 않으면 c[i] =0
- c[i]> 0이면 플래그 설정 :=false
- 그렇지 않으면 플래그 설정 :=false
- c[i] =2이면
- 플래그가 거짓이거나 u가 0이 아니거나 l이 0이 아니면 빈 값을 반환합니다.
- 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
#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, ],]