给定一个 n × n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。
对于这种旋转类的题目。首先要选准基准点。选好基准点以后会事半功倍。本题我么可以选准左上角和右下角两个基准点。
第一轮对下列数字进行旋转。定点为[0,0]和[3,3]
[
[ 5, 1, 9, 11],
[ 2, 10],
[13, 7],
[15,14,12,16]
]
请在这里输入引用内容
第二轮对下列数字进行旋转。定点为[1,1]和[2,2]。
[
[3, 6],
[14,12]
]
怎么旋转?对于5,11,16,15这几个数字。首先用tmp暂存5.然后将15放到5的位置,16放到15的位置,11放到16的位置。最后将tmp放到11的位置。对于1,10,12,13也是采用这种方式。首先用tmp暂存1.然后将12放到1的位置,12放到13的位置,10放到12的位置。最后将tmp放到10的位置。 根据这种规律即可完成旋转。每轮旋转以后将左上角定点横纵坐标+1,左上角定点横纵坐标++,右下角定点横纵坐标-1。
public void rotate(int[][] matrix) {
if (matrix == null || matrix.length == 0) {
return;
}
int rowStart = 0;
int colStart = 0;
int rowEnd = matrix.length - 1;
int colEnd = matrix[0].length - 1;
while (rowStart < rowEnd) {
help(matrix,rowStart,colStart,rowEnd,colEnd);
rowStart++;
colStart++;
rowEnd--;
colEnd--;
}
}
private void help(int[][] matrix, int rowStart, int colStart, int rowEnd, int colEnd) {
int time = rowEnd - rowStart;
for (int i = 0; i < time; i++) {
int tmp = matrix[rowStart][colStart + i];
matrix[rowStart][colStart + i] = matrix[rowEnd - i][colStart];
matrix[rowEnd - i][colStart] = matrix[rowEnd][colEnd - i];
matrix[rowEnd][colEnd - i] = matrix[rowStart + i][colEnd];
matrix[rowStart + i][colEnd] = tmp;
}
}