📅  最后修改于: 2023-12-03 14:51:06.978000             🧑  作者: Mango
给定一个大小为n x n的二进制矩阵和一系列操作,每个操作会选择一个左上角坐标为(row1,col1)、右下角坐标为(row2,col2)的子矩阵,并将子矩阵中的每个元素进行翻转(即0变成1,1变成0)。请你返回执行所有操作后,二进制矩阵的结果。
class Solution:
def flipAndInvertImage(self, A: List[List[int]]) -> List[List[int]]:
def flip(row):
i, j = 0, len(row) - 1
while i < j:
row[i], row[j] = row[j], row[i]
i += 1
j -= 1
def invert(row):
for i in range(len(row)):
row[i] = 1 - row[i]
for row in A:
flip(row)
invert(row)
return A
对于一个矩阵的一行,执行翻转和反转操作可以通过双指针来完成。具体实现如下:
def flip(row):
i, j = 0, len(row) - 1
while i < j:
row[i], row[j] = row[j], row[i]
i += 1
j -= 1
def invert(row):
for i in range(len(row)):
row[i] = 1 - row[i]
在实现过程中,我们首先需要翻转每一行的元素,然后进行反转操作。最后,将处理好的矩阵返回。
for row in A:
flip(row)
invert(row)
return A
时间复杂度:$O(n^2)$
翻转和反转操作都需要遍历一遍每行元素,因此时间复杂度为$O(n)$,而对于整个矩阵来说,需要遍历$n$行,因此时间复杂度为$O(n^2)$。
空间复杂度:$O(1)$
除了返回的结果矩阵外,不需要使用额外的空间。
本题主要考察对矩阵的操作理解以及代码实现能力。对于每行的翻转和变换操作可以通过双指针来完成。整个矩阵的操作则需要对每行分别进行处理。
实现过程中需要注意矩阵操作的边界条件。以下是完整的代码实现: