48. 旋转图像
题目:
思路:
【1】这道题的难点在于要知道旋转的规律与如何避免重复处理的问题
其中xc和yc分别为数组的边界值
xc = 数组行数 - 1 (因为正常下标是从0开始的,而长度统计是比边界值+1的)
yc = 数组列数 - 1
旋转90度
(x, y) -> (y, xc - x)
旋转180度
(x, y) -> (xc - x, xc - y)
旋转270度
(x, y) -> (yc - y, xc - x)
代码展示:
//时间0 ms 击败 100% //内存39.8 MB 击败 99.47% class Solution { public void rotate(int[][] matrix) { // 列数 int col = matrix[0].length; // 行数 int row = matrix.length; // 利用标记来记录是否对某个位置进行过处理 int[][] flag = new int[row][col]; // 全部置为没有变动过 for (int[] ints : flag) { Arrays.fill(ints, 0); } int tem; for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ // 已经处理过了就不再处理 if (flag[i][j] == 1) continue; int oldCol = j; int oldRow = i; int oldValue = matrix[oldRow][oldCol]; boolean isRotate = true; while (isRotate){ int newCol = row - 1 - oldRow; int newRow = oldCol; tem = matrix[newRow][newCol]; matrix[newRow][newCol] = oldValue; oldValue = tem; oldRow = newRow; oldCol = newCol; // 如果已经转完一圈了应该结束循环 if (newRow == i && newCol == j){ isRotate = false; } //将该位置设置为处理过了 flag[newRow][newCol] = 1; } } } } } //时间0 ms 击败 100% //内存40 MB击败 95.96% //先将翻转的数据放于辅助空间再覆盖回原数组 class Solution { public void rotate(int[][] matrix) { int n = matrix.length; int[][] matrix_new = new int[n][n]; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { matrix_new[j][n - i - 1] = matrix[i][j]; } } for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { matrix[i][j] = matrix_new[i][j]; } } } }