【问题描述】 [面试题 01.07. 旋转矩阵]
示例 1:给定 matrix =
[[1,2,3],[4,5,6],[7,8,9]
],原地旋转输入矩阵,使其变为:
[[7,4,1],[8,5,2],[9,6,3]
]给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。不占用额外内存空间能否做到?
【解答思路】
1. 借助辅助矩阵 找规律 (不符合题意)
时间复杂度:O(N^2) 空间复杂度:O(N)
public void rotate1(int[][] matrix) {if (matrix == null || matrix.length == 0) return;int n = matrix.length;int[][] res = new int[n][n];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {res[j][n-i-1] = matrix[i][j];}}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {matrix[i][j] = res[i][j];}}}
2.先沿对角线翻转 ,再沿中间列翻转
时间复杂度:O(N^2) 空间复杂度:O(1)
class Solution {public void rotate(int[][] matrix) {int n = matrix.length;//矩阵转置,即按斜对角线进行数据交换for(int i=0;i<n;i++){for(int j=i;j<n;j++){int temp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = temp;}}//矩阵根据中间列进行对折,得到最终结果for(int i=0;i<n;i++){for(int j=0;j<n/2;j++){int temp = matrix[i][j];matrix[i][j] = matrix[i][n-j-1];matrix[i][n-j-1] = temp;}}}
}
3. 原地修改,原矩阵分块交换 四个一组 交换位置
时间复杂度:O(N^2) 空间复杂度:O(1)
public void rotate2(int[][] matrix) {if (matrix == null || matrix.length == 0) return;int n = matrix.length;for (int i = 0; i < n / 2 ; i++) {for (int j = 0; j < (n + 1) / 2; j++) {int tmp = matrix[i][j];matrix[i][j] = matrix[n-j-1][i];matrix[n-j-1][i] = matrix[n-i-1][n-j-1];matrix[n-i-1][n-j-1] = matrix[j][n-i-1];matrix[j][n-i-1] = tmp;}}}
【总结】
- 翻转数组 找规律
- 分块分治思想 对折思想
- 优化思想 空间时间互换