Algorithm 旋转图像-Java
我在做一个问题,给定一个表示图像的nx2d矩阵,将图像旋转90度(顺时针)。你必须将图像旋转到位,这意味着你必须直接修改输入的二维矩阵。不要分配另一个二维矩阵并进行旋转。这是我的代码: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++)
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]
的上一个值不再可以进一步旋转。请手动在纸上执行代码。(那需要一分钟。)这将很有启发性。