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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章