在2行n列的矩阵中,所有行相加=所有列相加
因为只有2行,所有如果列中有2,那两行中必须都出现1才能凑2
由上述性质可得满足一下三个条件即可重构此矩阵:
1.
2.colsum中2的个数小于等于upper
3.colsum中2的个数小于等于lower
满足这三个条件即可重构此矩阵,但是题目要求输出满足的矩阵,现在就要考虑怎么处理1的位置合理。
先处理第一行,先把有2所在的列填上1,如果不够再在任意不为1的位置补1,直到1的个数和upper相等即可。在每次填1的时候记得colsum--。
因为第一行每次填完后colsum--,现在只需要在colsum=1的列填1即可。
class Solution {
public:
vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {
int n=colsum.size();
vector<vector<int>>ans(2, vector<int>(n));
int sum=0;
int que[100010];
int idx=0;
int cnt=0;
for(int i=0;i<n;i++)
{
sum+=colsum[i]; //计算列的和
if(colsum[i]==2) //处理2
{
que[idx++]=i; //将2所在下标存住
colsum[i]--;
cnt++; //计算2的个数
}
}
if(upper+lower!=sum||cnt>upper||cnt>lower) return vector<vector<int>>(); //不满足三个条件
int cur=idx;//下一步要填2,所以当前填过的数字等于2的个数
while(idx>=1) ans[0][que[--idx]]=1; //将2所在的列先填进去
for(int i=0;i<n;i++)
{
if(cur<upper) //如果当前填的数字小于upper
{
if(colsum[i]==1&&ans[0][i]==0) //colsum=1并且答案中目前为0,防止和填2那一步填重
{
ans[0][i]=1;
colsum[i]--;
cur++;
}
}
}
for(int i=0;i<n;i++)
{
if(colsum[i]==1) ans[1][i]=1; //剩下的直接填即可,是1就填,是0就不填
else ans[1][i]=0;
}
return ans;
}
};