返回
剖析 LeetCode 832:反转图像的简洁明了解法
见解分享
2023-12-31 09:44:05
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
转换为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
转换为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
转换为0
,将0
转换为1
。
结论
通过这篇博客文章,我们深入探讨了 LeetCode 832:“反转图像”问题。我们提供了 Java、Python 和 C++ 中的简洁明了的解决方案,并详细介绍了其背后的直观思考。通过掌握图像反转的技巧,我们可以高效地解决类似的问题,并在图像处理领域中大放异彩。