48. 旋转图像

发现规律如下:

  • i行元素旋转到第n-1-i
  • j列元素旋转到第j

于是任意(i,j)位置的元素旋转后的坐标为(j, n-1-i)

matrix[j][n - 1 - i] = matrix[i][j];

原地操作如下:(这是一轮的情况,只需要对矩阵的左上方的元素分别进行一轮)

48. 旋转图像_第1张图片

将矩阵进行切块,切成四份,如果n是偶数,取n/2行和n/2列,如果n是奇数,取n/2行和(n+1)/2

四个角的相互转换如下:

int temp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - j][i];
matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
matrix[j][n - 1 - i] = temp;

完整代码:

class Solution {
    public void rotate(int[][] matrix) {
        // (i, j) -> (j, n - 1 - i)
        int n = matrix.length;
        int s = n / 2, t = n % 2 == 0 ? n / 2 : (n + 1) / 2;

        for (int i = 0; i < s; i++) {
            for (int j = 0; j < t; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - j][i];
                matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
                matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
                matrix[j][n - 1 - i] = temp;
            }
        }
    }
}

你可能感兴趣的:(LeetCode,算法)