LeetCode1253. Reconstruct a 2-Row Binary Matrix(重构2行二进制矩阵)

1253. Reconstruct a 2-Row Binary Matrix

Given the following details of a matrix with n columns and 2 rows :

  • The matrix is a binary matrix, which means each element in the matrix can be 0 or 1.
  • The sum of elements of the 0-th(upper) row is given as upper.
  • The sum of elements of the 1-st(lower) row is given as lower.
  • The sum of elements in the i-th column(0-indexed) is colsum[i], where colsum is given as an integer array with length n.

Your task is to reconstruct the matrix with upper, lower and colsum.

Return it as a 2-D integer array.

If there are more than one valid solution, any of them will be accepted.

If no valid solution exists, return an empty 2-D array.

Example 1:

Input: upper = 2, lower = 1, colsum = [1,1,1]
Output: [[1,1,0],[0,0,1]]
Explanation: [[1,0,1],[0,1,0]], and [[0,1,1],[1,0,0]] are also correct answers.

Example 2:

Input: upper = 2, lower = 3, colsum = [2,2,1,1]
Output: []

Example 3:

Input: upper = 5, lower = 5, colsum = [2,1,2,0,1,0,1,2,0,1]
Output: [[1,1,1,0,1,0,0,1,0,0],[1,0,1,0,0,0,1,1,0,1]]

Constraints:

  • 1 <= colsum.length <= 10^5
  • 0 <= upper, lower <= colsum.length
  • 0 <= colsum[i] <= 2

题目:给你一个2行n列的二进制数组:

  • 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是0就是1。
  • 第0行的元素之和为 upper。
  • 第1行的元素之和为 lower。
  • 第i列(从0开始编号)的元素之和为colsum[i]colsum是一个长度为 n 的整数数组。
  • 你需要利用upperlowercolsum来重构这个矩阵,并以二维整数数组的形式返回它。

如果有多个不同的答案,那么任意一个都可以通过本题。如果不存在符合要求的答案,就请返回一个空的二维数组。

思路:贪心,参考Link。对于colsum[i]=2的列,其返回的结果数组res[0][i]=res[1][i]只能为1;在第一行的和小于upper的前提下,若colsum[i]=1,使得res[0][i]=1;同理处理第二行。

工程代码下载

class Solution {
public:
    vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {
		int n = colsum.size();
		vector<vector<int>> res(2, vector<int>(n, 0));

		// 对列值为2的位置上下均置1
		for (int i = 0; i < n; ++i) {
			if (colsum[i] == 2) {
				res[0][i] = 1;
				res[1][i] = 1;
			}
		}

		int upper_sum = accumulate(res[0].begin(), res[0].end(), 0);
		for (int i = 0; i < n && upper_sum < upper; ++i) {
			// 当前列的和为1,且此时第一行的和小于upper
			if (colsum[i] == 1) {
				res[0][i] = 1;
				upper_sum += 1;
			}
		}

		int lower_sum = accumulate(res[1].begin(), res[1].end(), 0);
		for (int i = 0; i < n; ++i) {
			if (colsum[i] == 1 && res[0][i] == 0) {
				res[1][i] = 1;
				lower_sum += 1;
			}
		}

		if (upper_sum != upper || lower_sum != lower)
			return {};
	
		return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值