[LeetCode每日一题] 面试题 01.07. Rotate Matrix LCCI

155 阅读2分钟

这题难度不大,关键在于如何写得优雅,与48. Rotate Image是同一题。

解法一,直接旋转。把正方形平面旋转看作一层层的正方形边框旋转,也可看成是正方形边框上许多组四条边上的四个点间旋转互换位置。假如第i行作为正方形上边,其上某点(i,j),那么它对应右边的点为(j,n-1-i),下边的点为(n-1-i,n-j-1),左边的点为(n-1-j,i)。

var rotate = function(matrix) {
    let n = matrix.length
    for (let i = 0; i < Math.floor(n/2); i++) {
        for (let j = i; j < n-1-i; j++) {
            [matrix[i][j],matrix[j][n-1-i],matrix[n-1-i][n-1-j],matrix[n-1-j][i]] = 
            [matrix[n-1-j][i],matrix[i][j],matrix[j][n-1-i],matrix[n-1-i][n-1-j]]
        }
    }
};  

解法二,用翻转代替旋转。先上下翻转,再沿主对角线翻转即可;或者先左右翻转再沿副对角线翻转;或者先沿副对角线翻转,再上下翻转;或者先沿主对角线翻转再左右翻转。都可。自己画个正方形脑子里模拟一下看看。下面给了四种翻转,可以自行排列组合试试。

var rotate = function(matrix) {
    const n = matrix.length
    // 左右翻转
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n/2; j++) {
            [matrix[i][j],matrix[i][n-1-j]] = [matrix[i][n-1-j],matrix[i][j]]
        }
    }
    // 上下翻转
    // for (let j = 0; j < n; j++) {
    //     for (let i = 0; i < n/2; i++) {
    //         [matrix[i][j],matrix[n-1-i][j]] = [matrix[n-1-i][j],matrix[i][j]]
    //     }
    // }
    // 沿主对角线翻转
    // for (let i = 0; i < n; i++) {
    //     for (let j = 0; j < i; j++) {
    //         [matrix[i][j],matrix[j][i]] = [matrix[j][i],matrix[i][j]]
    //     }
    // }
    // 沿副对角线翻转
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n-1-i; j++) {
            [matrix[i][j],matrix[n-1-j][n-1-i]] = [matrix[n-1-j][n-1-i],matrix[i][j]]
        }
    }
};