1253. 重构 2 行二进制矩阵
大约 2 分钟
1253. 重构 2 行二进制矩阵
- 标签:贪心、数组、矩阵
- 难度:中等
题目链接
题目大意
描述:给定一个 行 列的二进制数组:
- 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 就是 。
- 第 行的元素之和为 。
- 第 行的元素之和为 r。
- 第 列(从 开始编号)的元素之和为 , 是一个长度为 的整数数组。
要求:你需要利用 , 和 来重构这个矩阵,并以二维整数数组的形式返回它。
说明:
- 如果有多个不同的答案,那么任意一个都可以通过本题。
- 如果不存在符合要求的答案,就请返回一个空的二维数组。
- 。
- 。
- 。
示例:
- 示例 1:
输入:upper = 2, lower = 1, colsum = [1,1,1]
输出:[[1,1,0],[0,0,1]]
解释:[[1,0,1],[0,1,0]] 和 [[0,1,1],[1,0,0]] 也是正确答案。
- 示例 2:
输入:upper = 2, lower = 3, colsum = [2,2,1,1]
输出:[]
解题思路
思路 1:贪心算法
- 先构建一个 的答案数组 ,其中 表示矩阵的第 行, 表示矩阵的第 行。
- 遍历数组 ,对于当前列的和 来说:
- 如果 ,则需要将 和 都置为 ,此时 和 各自减去 。
- 如果 ,则需要将 置为 或将 置为 。我们优先使用元素和多的那一项。
- 如果 ,则优先使用 ,将 置为 ,并且令 减去 。
- 如果 ,则优先使用 ,将 置为 ,并且令 减去 。
- 如果 ,则需要将 和 都置为 。
- 在遍历过程中,如果出现 或者 ,则说明无法构造出满足要求的矩阵,则直接返回空数组。
- 遍历结束后,如果 和 都为 ,则返回答案数组 ;否则返回空数组。
思路 1:代码
class Solution:
def reconstructMatrix(self, upper: int, lower: int, colsum: List[int]) -> List[List[int]]:
size = len(colsum)
ans = [[0 for _ in range(size)] for _ in range(2)]
for i in range(size):
if colsum[i] == 2:
ans[0][i] = ans[1][i] = 1
upper -= 1
lower -= 1
elif colsum[i] == 1:
if upper > lower:
ans[0][i] = 1
upper -= 1
else:
ans[1][i] = 1
lower -= 1
if upper < 0 or lower < 0:
return []
if lower != 0 or upper != 0:
return []
return ans
思路 1:复杂度分析
- 时间复杂度:。
- 空间复杂度:。