【Leetcode】1253. Reconstruct a 2-Row Binary Matrix

题目地址:

https://leetcode.com/problems/reconstruct-a-2-row-binary-matrix/description/

要求以给定信息,构造一个只含数字 0 , 1 0,1 0,1 2 × n 2\times n 2×n的矩阵。信息如下:
1、第一行的和 u u u,第二行的和 l l l
2、每一列的和。
无解则返回空数组。

如果某一列的和为 2 2 2,那我们已经知道了这一列两个数字都是 1 1 1;如果某一列的和为 0 0 0,则两个数都是 0 0 0;否则的话,我们先尝试用掉 u u u次将第一行数字变 1 1 1的机会,再用 l l l次将第二行数字变为 1 1 1的机会。最后看一下是否符合要求即可。代码如下:

class Solution {
 public:
  vector<vector<int>> reconstructMatrix(int up, int low, vector<int>& cs) {
    int n = cs.size();
    vector<vector<int>> res(2, vector<int>(n));
    for (int i = 0; i < n; i++)
      if (cs[i] == 2) {
        res[0][i] = res[1][i] = 1;
        up--;
        low--;
      }
    // up和low已经不够用了,说明无解
    if (up < 0 || low < 0) return vector<vector<int>>();
    // 改第一行
    for (int i = 0; i < n; i++)
      if (up && cs[i] == 1 && res[0][i] + res[1][i] == 0) {
        res[0][i] = 1;
        up--;
      }
	// 改第二行
    for (int i = 0; i < n; i++)
      if (low && cs[i] == 1 && res[0][i] + res[1][i] == 0) {
        res[1][i] = 1;
        low--;
      }
    // up和low余额没用光,说明无解
    if (up || low) return vector<vector<int>>();
    // 最后验证一下
    for (int i = 0; i < n; i++)
      if (res[0][i] + res[1][i] != cs[i]) return vector<vector<int>>();
    return res;
  }
};

时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值