007-leetcode-nxn矩阵旋转90度

package array;

/**
 * 旋转图像
 * <p>
 * 给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
 * <p>
 * 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
 * <p>
 * <p>
 * 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
 * 输出:[[7,4,1],[8,5,2],[9,6,3]]
 * <p>
 * <p>
 * 作者:力扣 (LeetCode)
 * 链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnhhkv/
 * 来源:力扣(LeetCode)
 * 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 */
public class RotateImage {

    public static void main(String[] args) {
        int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        rotateMatrix(matrix);
        for(int row=0; row< matrix.length; row++){
            for (int column=0; column< matrix.length; column++){
                System.out.println("Matrix "+matrix[row][column]);
            }
        }
    }

    /**
     * 1   2   3     7  4  1
     * 4   5   6  => 8  5  2
     * 7   8   9     9  6  3
     * <p>
     * 要点:
     *
     * 旋转90度
     *
     * [i][j]    ---->  [j][n-i]
     * [j][n-i]  ---->  [n-i][n-j]
     * [n-i][n-j]---->  [n-j][i]
     * [n-j][i]  ---->  [i][j]
     *
     * [i][j]-->[j][n-i]-->[n-i][n-j]-->[n-j][i]-->[i][j]
     *
     *  i =0, j = 1 n=2 是
     *  8--> 4  8替换4  M[2][1] (8) --->M[1][0] (4)  ----> [n-i][n-j] -->[n-j][i]
     *  6--> 8  6替换8  M[1][2] (6) --->M[2][1] (8)  ----> [j][n-i] --->[n-i][n-j]
     *  2--> 6  2替换6  ...
     *  4--> 2  4替换2  ...
     *
     *  这个公式推导很难,很难知道之间的关系,需要仔细思考,看了答案才知道怎么考虑的
     *
     *  1  2 --->  3  1
     *  3  4       4  2
     *
     **/
    private static void rotateMatrix(int[][] matrix) {
        int n = matrix.length -1;
        int temp = 0;
        for (int i =0; i< (n+1)/2; i++) { // (n+1)/2是旋转次数  如果是n = 4的话 旋转就分为内外两层 (4+1/2 = 2
             for (int j = i; j< n-i; j++) {
                  temp = matrix[n-j][i]; // 这句的意思是先记住原来的值是多少,因为后面的操作会覆盖掉,且最终要给 matrix[i][j] 赋值用
                  matrix[n-j][i] = matrix[n-i][n-j];
                  matrix[n-i][n-j] = matrix[j][n-i];
                  matrix[j][n-i] = matrix[i][j];
                  matrix[i][j] = temp;
             }
        }
    }
}

输出:

Matrix 7
Matrix 4
Matrix 1
Matrix 8
Matrix 5
Matrix 2
Matrix 9
Matrix 6
Matrix 3

查看其他人的思路:1. 先上下交换 2. 对角线交换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值