LeetCode 第 48 题
略微有点麻烦,主要在于处理数据的交换和记录这一块
我是每次旋转一层,然后依次递进,start变量表示旋转的起点,从0开始,依次加1,也就是(0,0),(1,1),相对于遍历正方形的对角线。
然后每次用一个数组来记录要被替换的正方形的那条边。数组的长度记为len,每次旋转一层之后,len=len-2,因为下一层正方形要比外面一层少2个元素。
每一个for循环都是一次替换,总共替换4次。
class Solution {
public void rotate(int[][] matrix) {
int length = matrix.length;
int start = 0;
int len = length;
while(start <= length/2) {
int[] arr = new int[len];
for(int i = 0; i < len; i++) {
int temp = matrix[start+len-i-1][start+len-1];
matrix[start+len-i-1][start+len-1] = matrix[start][start+len-i-1];
arr[len-i-1] = temp;
}
int endNum = arr[len-1];
for(int i = 0; i < len; i++) {
int temp = matrix[start+len-1][start+i];
matrix[start+len-1][start+i] = arr[len-i-1];
arr[len-i-1] = temp;
}
arr[0] = endNum;
endNum = arr[len-1];
for(int i = 0; i < len; i++) {
int temp = matrix[start+i][start];
matrix[start+i][start] = arr[len-i-1];
arr[len-i-1] = temp;
}
arr[0] = endNum;
for(int i = 0; i < len; i++) {
matrix[start][start+i] = arr[i];
}
start++;
len -= 2;
if(len == 0) {
break;
}
}
}
}
结果