Algorithm 旋转图像-Java

Algorithm 旋转图像-Java,algorithm,Algorithm,我在做一个问题,给定一个表示图像的nx2d矩阵,将图像旋转90度(顺时针)。你必须将图像旋转到位,这意味着你必须直接修改输入的二维矩阵。不要分配另一个二维矩阵并进行旋转。这是我的代码: class Solution { public void rotate(int[][] matrix) { int size = matrix.length; for(int i = 0 ; i < matrix.length; i++)

我在做一个问题,给定一个表示图像的nx2d矩阵,将图像旋转90度(顺时针)。你必须将图像旋转到位,这意味着你必须直接修改输入的二维矩阵。不要分配另一个二维矩阵并进行旋转。这是我的代码:

   class Solution {
        public void rotate(int[][] matrix) {
            int size = matrix.length;
            for(int i = 0 ; i < matrix.length; i++){
                for(int y = 0 ; y < matrix[0].length ; y++){
                    matrix[i][y] = matrix[size - y - 1][i];
                    System.out.println(size - y - 1);
                    System.out.println(i);
                    System.out.println("");
                }
            }
        }
    }

有什么问题吗?

我找到了解决办法。我会尽力解释的

让我们考虑一个数组<代码>大小4 < /代码> ./p>

1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16
现在让我们看看仅在阵列外部显示的数字:

我们将继续将第一个元素
1
存储在
临时变量中。接下来我们将
用13替换1
13替换16
16替换4
,最后将
4替换1
(其值已存储在临时变量中)

我们将对第一行的所有元素执行相同的操作

这是一个伪代码,如果你只想旋转这个外环,让我们称它为
外环

for i = 0 to n-1
{
    temp = A[0][i];
    A[0][i] = A[n-1-i][0];
    A[n-1-i][0] = A[n-1-0][n-1-i];
    A[n-1-0][n-1-i] = A[i][n-1-0];
    A[i][n-1-0] = temp;
}
   6  7   
  10 11      
代码总共运行
n次
。第一行的每个元素一次。实现此代码并运行它。您将看到只有外圈旋转。现在让我们看一下
内圈

for i = 0 to n-1
{
    temp = A[0][i];
    A[0][i] = A[n-1-i][0];
    A[n-1-i][0] = A[n-1-0][n-1-i];
    A[n-1-0][n-1-i] = A[i][n-1-0];
    A[i][n-1-0] = temp;
}
   6  7   
  10 11      
现在伪代码中的循环只需要运行
2次
,我们的索引范围也减少了。对于
外圈
,循环从
i=0
开始,在
i=n-1
结束。但是,对于
内环
而言,for循环需要从
i=1
运行到
i=n-2

如果数组的大小为
n
要旋转数组的
xth
环,循环需要从
i=x
运行到
i=n-1-x

以下是旋转整个阵列的代码:

x = 0;
int temp;

while (x < n/2)
{
    for (int i = x;i < n-1-x;i++)
    {
        temp = arr[x][i];
        arr[x][i] = arr[n-1-i][x];
        arr[n-1-i][x] = arr[n-1-x][n-1-i];
        arr[n-1-x][n-1-i] = arr[i][n-1-x];
        arr[i][n-1-x] = temp;
    }

    x++;
}
x=0;
内部温度;
而(x
这里x的每个值表示第x个环


当你这样做时,
0矩阵[i][y]=矩阵[size-y-1][i]
,矩阵[i][y]
的上一个值不再可以进一步旋转。请手动在纸上执行代码。(那需要一分钟。)这将很有启发性。