在数组操作练习中,经常出现的一个问题是如何将二维数组旋转90度。有一些SO帖子回答了如何在各种编程语言中实现它。我的问题是澄清其中一个答案并探讨为了以有机的方式得到答案需要哪些思维过程。
我发现的解决此问题的方法如下:
public static void rotate(int[][] matrix,int n)
{
for( layer = 0;layer < n/2;++layer){
int first = layer;
int last = n -1 - layer;
for(int i = first;i<last;++i){
int offset = i - first;
int top = matrix[first][i];
matrix[first][i] = matrix[last-offset][first];
matrix[last-offset][first] = matrix[last][last-offset];
matrix[last][last-offset] = matrix[i][last];
matrix[i][last] = top;
}
}
}
我大致了解以上代码的意图,它通过进行四向交换来交换极端/角落,并对某些偏移量分隔的其他单元格执行相同操作。
逐步执行此代码,我知道它可以工作,但我不理解上述算法的数学基础。 '层','第一','最后'和偏移量背后的原理是什么?
为什么'last'变成了
n-1-layer
?为什么偏移量是i-first
?首先,偏移量是什么?如果有人能解释这个算法的起源并带领我通过思考过程找出解决方案,那就太好了。
谢谢