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, ],]