2023.6.29每日一题

该文章描述了一个编程问题,涉及重构一个2行n列的矩阵,使得所有行的和等于所有列的和。关键在于处理2的分布,确保不超过upper和lower限制。解决方案首先处理包含2的列,然后填充剩余的1,最终得到满足条件的矩阵。
摘要由CSDN通过智能技术生成

        在2行n列的矩阵中,所有行相加=所有列相加

        因为只有2行,所有如果列中有2,那两行中必须都出现1才能凑2

由上述性质可得满足一下三个条件即可重构此矩阵:

        1.\sum colsum=upper+lower

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

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值