给定一个 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; } }