返回
图像旋转的巧思:翻转与原位替换
前端
2024-02-28 16:46:58
旋转图像是一项常见的图像处理任务,它可以用来纠正图像方向或用于创建特定效果。在 LeetCode 中的第 17 题中,我们需要编写一个函数来旋转一个给定的方形图像 90 度。
原位替换的巧思
原位替换是一种无需创建新数组即可旋转图像的方法。它通过交换图像中的元素来实现,不需要额外的空间开销。
原位替换的关键是找到元素的新位置。对于一个 N x N 图像,元素 (i, j) 在旋转后的位置为 (N - 1 - j, i)。例如,在 3 x 3 图像中,元素 (1, 2) 旋转后将位于 (2, 1)。
我们可以使用两个嵌套循环遍历图像,并按照这个规则交换元素。以下代码演示了原位替换的方法:
def rotate_image(matrix):
n = len(matrix)
# 按对角线交换元素
for i in range(n):
for j in range(i):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
# 水平翻转元素
for i in range(n):
for j in range(n // 2):
matrix[i][j], matrix[i][n - 1 - j] = matrix[i][n - 1 - j], matrix[i][j]
翻转的优雅
LeetCode 官方题解中提供了另一种更优雅的旋转图像方法,它使用了翻转操作。首先,它将图像垂直翻转,然后沿对角线翻转。
垂直翻转可以交换图像中每一行的元素,而对角线翻转可以交换图像中每一列的元素。这两种操作的组合可以实现 90 度的旋转。
以下是使用翻转方法的代码:
def rotate_image(matrix):
n = len(matrix)
# 垂直翻转
for i in range(n // 2):
for j in range(n):
matrix[i][j], matrix[n - 1 - i][j] = matrix[n - 1 - i][j], matrix[i][j]
# 对角线翻转
for i in range(n):
for j in range(i):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
总结
旋转图像可以通过原位替换或翻转的方法实现。原位替换的方法更直接,但需要找出元素旋转后的新位置。翻转的方法更优雅,但需要理解翻转操作的原理。这两种方法都有其优缺点,开发者可以根据需要选择合适的方法。