这个原地旋转,中午午休前 按照坐标旋转,没做出来。晚上睡觉突然想到,一圈一圈的旋转,一次只考虑一行,嗯挺简单的,第二天早上做出来了,是一个数组转换成另一个数组。但是 不是原始数组旋转。
如果原始数组旋转,需要一次转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
        }

    }

};

现刻
173 声望0 粉丝

勤思笃行