返回

剖析 LeetCode 832:反转图像的简洁明了解法

见解分享

LeetCode 832:反转图像

题目

给定一个黑白图像,该图像由一个布尔值矩阵表示,其中 true 表示黑色像素,而 false 表示白色像素。将图像顺时针旋转 90 度。

示例:

输入:
[[1,1,0],
 [0,1,1],
 [0,1,1]]

输出:
[[0,0,1],
 [0,1,1],
 [1,1,1]]

直观的思考

首先,我们需要理解图像反转的含义。图像由像素组成,而像素可以是黑色或白色。当我们顺时针旋转图像 90 度时,每个像素的位置都会发生改变。

为了反转图像,我们可以从左上角开始,遍历图像中的每个像素。对于每个像素,我们需要将其移动到图像的另一侧。

例如,对于示例图像,左上角的像素 (1, 1) 应移动到右下角 (3, 3)。

Java 解决方案

public class Solution {
    public int[][] flipAndInvertImage(int[][] image) {
        int n = image.length;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n / 2; j++) {
                int temp = image[i][j];
                image[i][j] = image[i][n - j - 1];
                image[i][n - j - 1] = temp;
            }
            for (int j = 0; j < n; j++) {
                image[i][j] ^= 1;
            }
        }
        return image;
    }
}

思路:

  1. 首先,我们遍历每行,并交换图像两侧的像素。
  2. 然后,我们遍历每行,并对每个像素执行按位异或运算,将 1 转换为 0,将 0 转换为 1

Python 解决方案

def flipAndInvertImage(image):
    n = len(image)
    for i in range(n):
        image[i] = image[i][::-1]
        for j in range(n):
            image[i][j] ^= 1
    return image

思路:

  1. 首先,我们遍历每行,并反转图像的行。
  2. 然后,我们遍历每行,并对每个像素执行按位异或运算,将 1 转换为 0,将 0 转换为 1

C++ 解决方案

class Solution {
public:
    vector<vector<int>> flipAndInvertImage(vector<vector<int>>& image) {
        int n = image.size();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n / 2; j++) {
                swap(image[i][j], image[i][n - j - 1]);
            }
            for (int j = 0; j < n; j++) {
                image[i][j] ^= 1;
            }
        }
        return image;
    }
};

思路:

  1. 首先,我们遍历每行,并交换图像两侧的像素。
  2. 然后,我们遍历每行,并对每个像素执行按位异或运算,将 1 转换为 0,将 0 转换为 1

结论

通过这篇博客文章,我们深入探讨了 LeetCode 832:“反转图像”问题。我们提供了 Java、Python 和 C++ 中的简洁明了的解决方案,并详细介绍了其背后的直观思考。通过掌握图像反转的技巧,我们可以高效地解决类似的问题,并在图像处理领域中大放异彩。