这个原地旋转,中午午休前 按照坐标旋转,没做出来。晚上睡觉突然想到,一圈一圈的旋转,一次只考虑一行,嗯挺简单的,第二天早上做出来了,是一个数组转换成另一个数组。但是 不是原始数组旋转。
如果原始数组旋转,需要一次转4个角的点。 但是总是一部分坐标旋转错误。
后来经过分析,如果X轴作为圈,Y轴是不能超过X的坐标范围的,即X<=Y<length-1-X
给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var rotate = function(matrix) {
let len = matrix.length-1
let h = matrix.length/2
let lt
// 如果是4个数 旋转0,1 小于2,3个数旋转0,1小于1.5
for(let x = 0; x<h; x++) {
// x 代表旋转的外环,y的起点和结束点是不能超过x这个外环的
for(let y = x; y<len-x; y++) {
// 如果是两个数组转换 newMatrix[y][len-x] = matrix[x][y] 只考虑如第一行变成最后一列 即可
// 点的旋转 可能比较烧脑,如果先把一整行的旋转想明白点的旋转也清晰了
// 先缓存 左上角的点
lt = matrix[x][y]
// 左下角的点 替换左上角的点
matrix[x][y] = matrix[len-y][x]
// 右下角点点 替换左下角的点
matrix[len-y][x] = matrix[len-x][len-y]
// 右上角的点替换 右下角的点
matrix[len-x][len-y] = matrix[y][len-x]
// 左上角的点 替换 右上角的点
matrix[y][len-x] = lt
}
}
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。