// 因此可以使用一个同样大小的二维数组, 存储翻转后的结果, 然后再复制回去 int [] [] temp = new int[matrix.length][matrix[ 0 ].length] ; for (int i = 0 ; i < matrix.length; i ++) { for (int j = 0 ; j < matrix[0].length; j ++) { // 现在的列索引就是temp的行索引 // temp的列索引是固定的和当前i有关 temp [j] [matrix[0] .length - i - 1] = matrix [i] [j] ; // 将临时数组中的元素拷贝回去 for (int i = 0 ; i < matrix.length; i ++) { for (int j = 0 ; j < matrix[0].length; j ++) { matrix [i] [j] = temp [i] [j] ;

正确的原因

(1) 观测到第一行元素, 变成最后一列, 第二行元素, 变成倒数第二列

(2) 然后就可以找到翻转前后的索引关系.

版本2 正确 不使用额外空间, 推导出旋转180度, 旋转270度的情况

    public void rotate(int[][] matrix) {
        // 将二维数组中的图像, 顺时针旋转90度
        // 顺时针旋转90度, 相当于先把数组水平方向翻转(即上下两部分元素交换), 然后再按照左上到右下的对角线翻转
        // 顺时针旋转180度, 相当于先把数组先水平方向翻转, 然后再按垂直方向翻转(即左右两部分元素交换)
        // 顺时针旋转270, 即逆时针旋转90度, 相当于先把数组垂直方向翻转, 然后再按左上到右下的对角线翻转
        // 水平翻转
        for(int i = 0; i < matrix.length / 2; i ++) {
            for (int j = 0; j < matrix[0].length; j ++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[matrix.length - 1 - i][j];
                matrix[matrix.length - 1 - i][j] = temp;
        // 按照左上到右下的对角线翻转
        // 因为是n * n的二维数组, 不用担心按照对角线翻转后的数组越界问题
        for (int i = 0; i < matrix.length; i ++) {
            for (int j = 0; j < matrix[0].length; j ++) {
                if (j > i) {
                    // 代表对角线的上半部分
                    int temp = matrix[i][j];
                    matrix[i][j] = matrix[j][i];
                    matrix[j][i] = temp;

正确的原因

  •