LeetCode 48:三种解法玩转图像旋转(Python,Java解法)

张开发
2026/4/10 9:28:35 15 分钟阅读

分享文章

LeetCode 48:三种解法玩转图像旋转(Python,Java解法)
题目LeetCode.48给定一个n×n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转 90 度。你必须在原地旋转图像这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。Python解法解法一赋值到一个新空间class Solution: def rotate(self, matrix: List[List[int]]) - None: n len(matrix) new_matrix [[0] * n for _ in range(n)] for i in range(n): for j in range(n): new_matrix[j][n-i-1] matrix[i][j] matrix[:] new_matrix所给二维数组为方形直接测行数n len(matrix)创建一个等大的数组使用Python中的推导式转换数组代码核心new_matrix[j][n-i-1] matrix[i][j]。解法二直接四个元素转换class Solution: def rotate(self, matrix: List[List[int]]) - None: n len(matrix) for i in range(n // 2): for j in range((n1) // 2): a, b, c, d i, j, n - j - 1, n - i - 1 matrix[a][b], matrix[c][a], matrix[d][c], matrix[b][d] \ matrix[c][a], matrix[d][c], matrix[b][d], matrix[a][b]本解法比较难理解可尽量理解主要在于循环条件的控制和如何交换只遍历左上角一小块下面以题目为例展示过程矩阵1 2 3 4 5 6 7 8 9只需要处理左上角 4 个格子(0,0)、(0,1)、(1,0)、(1,1)旋转 (0,0)四元组(0,0) → (2,0) → (2,2) → (0,2)对应数字1 → 7 → 9 → 3旋转后3 2 1 4 5 6 9 8 7旋转 (0,1)四元组(0,1) → (1,0) → (2,1) → (1,2)对应数字2 → 4 → 8 → 6旋转后3 4 1 8 5 2 9 6 7旋转 (1,0)已经被上面处理过不会重复。旋转 (1,1)中心元素 5 自己转自己不变。最终结果7 4 1 8 5 2 9 6 3解法三先水平翻再 对角\翻class Solution: def rotate(self, matrix: List[List[int]]) - None: n len(matrix) for j in range(n//2): matrix[j],matrix[n-j-1]matrix[n-j-1],matrix[j] for i in range(n): for j in range(i): matrix[i][j],matrix[j][i] matrix[j][i], matrix[i][j]Java解法顺序同Python解法一class Solution { public void rotate(int[][] matrix) { int n matrix.length; int[][] new_matrix new int[n][n]; for(int i 0; i n; i){ for(int j 0; j n; j){ new_matrix[j][n - i -1] matrix[i][j]; } } for(int i 0; i n; i){ for(int j 0; j n; j){ matrix[i][j] new_matrix[i][j]; } } } }解法二public class Solution { public void rotate(int[][] matrix) { int n matrix.length; // 只遍历左上角 1/4 区域 for (int i 0; i n / 2; i) { for (int j 0; j (n 1) / 2; j) { // 暂存左上角的值 int temp matrix[i][j]; // 1. 左下 → 左上 matrix[i][j] matrix[n - 1 - j][i]; // 2. 右下 → 左下 matrix[n - 1 - j][i] matrix[n - 1 - i][n - 1 - j]; // 3. 右上 → 右下 matrix[n - 1 - i][n - 1 - j] matrix[j][n - 1 - i]; // 4. 暂存值 → 右上 matrix[j][n - 1 - i] temp; } } } }解法三public class Solution { public void rotate(int[][] matrix) { int n matrix.length; // 1. 水平上下翻转 for (int i 0; i n / 2; i) { for (int j 0; j n; j) { // 交换第 i 行和第 n-1-i 行的 j 列元素 int temp matrix[i][j]; matrix[i][j] matrix[n - 1 - i][j]; matrix[n - 1 - i][j] temp; } } // 2. 主对角线转置 for (int i 0; i n; i) { for (int j 0; j i; j) { // 交换 (i,j) 和 (j,i) int temp matrix[i][j]; matrix[i][j] matrix[j][i]; matrix[j][i] temp; } } } }总结本题通过三种解法详细解答了如何去翻转二维数组分别为赋值直接转换翻转三种每一种解法都很有特色希望大家能够找到自己合适的方法。

更多文章