📜  在 Q 查询的给定范围内翻转子矩阵后的二进制矩阵(1)

📅  最后修改于: 2023-12-03 14:51:06.978000             🧑  作者: Mango

在 Q 查询的给定范围内翻转子矩阵后的二进制矩阵

1. 问题描述

给定一个大小为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
2. 解题思路

对于一个矩阵的一行,执行翻转和反转操作可以通过双指针来完成。具体实现如下:

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
3. 复杂度分析

时间复杂度:$O(n^2)$

翻转和反转操作都需要遍历一遍每行元素,因此时间复杂度为$O(n)$,而对于整个矩阵来说,需要遍历$n$行,因此时间复杂度为$O(n^2)$。

空间复杂度:$O(1)$

除了返回的结果矩阵外,不需要使用额外的空间。

4. 总结

本题主要考察对矩阵的操作理解以及代码实现能力。对于每行的翻转和变换操作可以通过双指针来完成。整个矩阵的操作则需要对每行分别进行处理。

实现过程中需要注意矩阵操作的边界条件。以下是完整的代码实现: