leetcode 力扣 48 旋转图像

89 阅读1分钟

不要看官方题解的数学题,直接看“做你爱吃的唐僧肉”的题解,这位大佬的解法算是比较易懂了。

public void rotate(int[][] matrix) {

        int pos1 = 0, pos2 = matrix.length - 1;
        
        //想像一个4x4的矩形,四个角的坐标为(pos1, pos1)  (pos1, pos2)
        //                                (pos2, pos1)  (pos2, pos2)
        //                              即(0, 0)  (0, 3)
        //                                (3, 0)  (3, 3)
                                          
        int add = 0;   //偏移量add使矩阵在每一层内顺时针旋转,比如说(0, 0)移动完了到(0, 1)移动,
                       //所以左上角的坐标是(pos1, pos1 + add)
                       
        while (pos1 < pos2) {
            add = 0;
            while (add < pos2 - pos1) {
            
               //要注意,如果将temp设置为左下角的元素,那么必须从右下角的元素开始顺时针移动,
               //如果从其他位置的元素开始移动,比如右上角移到右下角,那么右下角的就被覆盖了,
               //要从符合顺时针旋转的、temp的上一个最近元素开始移动
               //注意坐标里add的加减
            
                //保存temp为左下角
                int temp = matrix[pos2 - add][pos1];
                //右下移到左下
                matrix[pos2 - add][pos1] = matrix[pos2][pos2 - add];
                //右上移到右下
                matrix[pos2][pos2 - add] = matrix[pos1 + add][pos2];
                //左上移到右上
                matrix[pos1 + add][pos2] = matrix[pos1][pos1 + add];
                //左下移到左上
                matrix[pos1][pos1 + add] = temp;
                //移动下一格子
                add += 1;
            }
            //移动下一层
            pos1 += 1;
            pos2 -= 1;
        }
    }