力扣 | 1253 重构 2 行二进制矩阵 | 填充

92 篇文章 0 订阅
42 篇文章 0 订阅

概要

填充元素只能为0 或者 1
填充的是一个两行N列的矩阵
初始化矩阵全部填充0
先把同一列,上下两行为1的填充
接着就只剩下要么上面填1下面填0或者上面填0下面填1
遍历是遍历列
如果列之和 等于1 ,且此时upper > 0 优先上面填充1,同时 --upper
如果 此时是lower > 0那么就填充下面为1 上面不管,同时 --lower

代码展示

class Solution {
public:
    vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {
        //满足 upper + lower = colsum
        // colsum长度确定列数
        //填充2行n列的矩阵  填充的元素不是0就是1
        //筛选一些情况
        //colsum[i]      0          1            2        >2
        //              全为0 一个为0一个为1 两个都为1 直接break
        int n = colsum.size();
        int sum = 0, twosum = 0;
        for(int i = 0; i < n; ++i){
            if(colsum[i] == 2){
                twosum++;
            }
            sum += colsum[i];
        }
        
        // twosum 统计的是上和下都为1 的中列数和    而upper 或者 lower都是统计 列数之和,如果那个列数之和比twosum还要大那也是不可以的   这个容易忽略 小于是可以的,因为还可能出现上为1下位0的情况,这种情况twosum是不会统计的
        if(sum != upper +lower || twosum > min(upper, lower)){
            return {};
        }
        //能走到这一步没就是可以填充矩阵了
        //先把规则的给填充
        upper -= twosum;
        lower -= twosum;

        vector<vector<int>> ans(2, vector<int>(n, 0));
        for(int i = 0; i < n; ++i){
            if(colsum[i] == 2){
                ans[0][i] = 1;
                ans[1][i] = 1;
            }else if(colsum[i] == 1){
                if(upper > 0){
                    ans[0][i] = 1;
                    --upper;
                }else{
                    ans[1][i] = 1;
                    --lower;
                }
            }
        }
        //注意 其他未填充的都是0 ,最开始就已经初始化了
        return ans;

        
    }
};

`

小结

很巧妙的贪心算法,很想高中时候的 0 1妙用的思想

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值