leetcode–rotate_image
题意: 给定一个n×n的二维矩阵,将它沿顺时针方向旋转90度
条件: 不引入额外的空间
分析: 本题考察二维数组索引的操作,采用的基本思想是先转置外圈,后转置内圈,从外向内转置,把问题简化。
红颜色的是外圈,绿颜色的是内圈,先将外圈全部转置完。(0,0)放到(0,3)的位置,(0,3)放到(3,3)的位置,(3,3)放到(3,0)的位置,(3,0)放到(0,0)的位置,这四步加起来是一次执行;第二次执行从(0,1)开始,放到(1,3)的位置……;第三次执行从(0,2)开始……。第三次执行完之后,外圈全部转置,然后再从内圈开始执行。
为此需要定义3个变量i, j, k。i表示每一圈的最大索引,初始值为n - 1,执行完一圈之后
i−−
;k表示每一圈的最小索引,初始值为0,执行完一圈之后
k++
;j用于在每一圈中从k到i遍历转置,
j=[k,i−1]
。每一次执行的第一步将
(k,j)
放到
(j,i)
的位置,第二步
(j,i)
放到
(i,i+k−j)
的位置,第三步将
(i,i+k−j)
放到
(i+k−j,k)
的位置,第四步将
(i+k−j,k)
放到
(k,j)
的位置。执行完四步之后
j++
,再次循环,终止条件是
k≥i
。
代码
public void rotate(int[][] matrix){
if(matrix == null || matrix.length == 1){
return;
}else{
int n = matrix.length; //n*n的矩阵,n表示大小
int i = n - 1; //数组的最后一个位置
int k = 0;
while(k < i){
for(int j = k; j < i; j++){ //for循环内是一次执行,i,k在一次执行中不变
int temp1 = matrix[j][i];
matrix[j][i] = matrix[k][j]; //(k, j)放到(j, i)的位置
int temp2 = matrix[i][i + k - j];
matrix[i][i + k - j] = temp1; //(j, i)放到(i, i+k-j)的位置
temp1 = matrix[i + k - j][k];
matrix[i + k - j][k] = temp2; //(i, i+k-j)放到(i+k-j, k)的位置
matrix[k][j] = temp1; //(i+k-j, k)放到(k,j)的位置
}
k++;
i--;
}
}
}