📌  相关文章
📜  水平翻转二进制矩阵

📅  最后修改于: 2021-05-24 19:17:48             🧑  作者: Mango

给定一个二进制矩阵。任务是水平翻转矩阵(查找矩阵的图像),然后将其反转。

注意事项

  • 水平翻转矩阵意味着反转矩阵的每一行。例如,水平翻转[1,1,0,0]会得到[0,0,1,1]。
  • 反转的矩阵单元,其替换每个0由1,反之亦然。例如,将[0,0,1]取反将得到[1,1,0]。

例子

Input: mat[][] = [[1, 1, 0], 
                  [1, 0, 1], 
                  [0, 0, 0]]
Output: [[1, 0, 0], 
         [0, 1, 0], 
         [1, 1, 1]]
Explanation: 
First reverse each row: [[0, 1, 1], [1, 0, 1], [0, 0, 0]]
Then, invert the image: [[1, 0, 0], [0, 1, 0], [1, 1, 1]]

Input: mat[][] = [[1, 1, 0, 0], 
                  [1, 0, 0, 1], 
                  [0, 1, 1, 1], 
                  [1, 0, 1, 0]]
Output: [[1, 1, 0, 0], 
         [0, 1, 1, 0], 
         [0, 0, 0, 1], 
         [1, 0, 1, 0]]
Explanation: 
First reverse each row: 
[[0, 0, 1, 1], [1, 0, 0, 1], [1, 1, 1, 0], [0, 1, 0, 1]].
Then invert the image:
[[1, 1, 0, 0], [0, 1, 1, 0], [0, 0, 0, 1], [1, 0, 1, 0]]

方法:我们可以就地执行此操作。仔细观察,可以推断出,在最终矩阵的每一行中,左数的第i个值等于输入二进制矩阵右数的第i个值的倒数。

因此,我们使用(Column + 1)/ 2(有下限划分)来迭代所有索引i在该行的前半部分(包括中心)并相应地更新答案。

下面是上述方法的实现:

# Python3 implementation of above approach
# Function to return final Image
  
def fliped_Invert_Image(mat):
  
    for row in mat:
        for i in range((len(row) + 1) // 2):
  
            row[i] = row[len(row) - 1 - i] ^ 1
            row[len(row) - 1 - i] = row[i] ^ 1
  
    # return Flipped and Inverted image
    return mat
  
# Driver code
mat = [[1, 1, 0, 0], [1, 0, 0, 1], [0, 1, 1, 1], [1, 0, 1, 0]]
  
print(fliped_Invert_Image(mat))
输出:
[[1, 1, 0, 0], [0, 1, 0, 1], [0, 0, 1, 1], [1, 0, 1, 0]]

时间复杂度: O(N * M),其中N是给定二进制矩阵中的行数,M是列数。