【算法训练】LeetCode#48 旋转图像

一、描述

48. 旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

二、思路

原地交换,尽可能的减少额外空间,用什么操作就呼之欲出了——亦或。

从外向内或者从内向外都可以。

三、解题


public class LeetCode48 {
    public static void main(String[] args) {
        int [][] matrix = new int[][]{{5,1,9,11},{2,4,8,10},{13,3,6,7},{15,14,12,16}};
        System.out.println(Arrays.deepToString(matrix));
        rotate(matrix);
        System.out.println(Arrays.deepToString(matrix));
    }
    public static void rotate(int[][] matrix) {
        int n = matrix.length;
        int i;
        int start = 0;
        int end = n-1;

        while (start < end){
            i = start+1;
            // 右交换
            for (int j = start+1 ; j <= end ; ++j){
                swap(matrix,start,i,j,end);
                i++;
            }
            i = start+1;
            // 下交换
            for (int j = end-1 ; j >= start ; --j){
                swap(matrix,start,i,end,j);
                i++;
            }
            i = start+1;
            // 左交换
            for (int j = end-1 ; j >= start ; --j){
                swap(matrix,start,i,j,start);
                i++;
            }
            start++;
            end--;
        }
    }

    public static void swap(int[][] matrix,int x1,int y1,int x2,int y2){
        matrix[x1][y1] = matrix[x1][y1] ^ matrix[x2][y2];
        matrix[x2][y2] = matrix[x1][y1] ^ matrix[x2][y2];
        matrix[x1][y1] = matrix[x1][y1] ^ matrix[x2][y2];
    }
}
posted @ 2023-03-16 16:04  小拳头呀  阅读(25)  评论(0编辑  收藏  举报