Sunny-117/js-challenges

旋转矩阵

Sunny-117 opened this issue · 3 comments

旋转矩阵
/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var rotate = function(matrix) {
    const n = matrix.length;
    const matrix_new = new Array(n).fill(0).map(() => new Array(n).fill(0)); //新矩阵
    for(let i = 0; i < n; i++){
        for(let j = 0; j < n; j++){
            matrix_new[j][n - i - 1] = matrix[i][j];
            //重点在这里,对于矩阵中第 i 行的第 j 个元素,在旋转后,它出现在倒数第 i 列的第 j 个位置。
           //倒数第i列相当于正数n-i列,因为下标从0开始,所以这里还要-1,第j个位置其实就是第j行
        }
    }
    for(let i = 0; i < n; i++){
        for(let j = 0; j < n; j++){
            matrix[i][j] = matrix_new[i][j];
        }
    }
};

情况一:顺时针转 90 度:先转置再左右镜像
情况二:顺时针转 180 度:先上下镜像,再左右镜像(先左右再上下也可)
情况三:顺时针转 270 度:先转置再上下镜像

/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var rotate = function(matrix) {
  const l = matrix.length - 1;
  // 转置
  for (let i = 0; i <= l; 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 <= l; i++) {
    for (let j = 0; j <= Math.floor(l / 2); j++) {
      [matrix[i][j],matrix[i][l - j]] = [matrix[i][l - j],matrix[i][j]];
    }
  }
};
function rotateMatrix(m: number[][]):void {
    let m_length: number = m[0].length;
    let temp: number;
    for (let i = 0; i < m_length; i++) {
        for (let j = 0; j < Math.floor(m_length>>1); j++) {
            temp = m[i][j];
            m[i][j] = m[i][m_length-1-j];
            m[i][m_length-1-j]=temp;
        }
    }
    for (let i = 0; i < m_length-1; i++) {
        for (let j = 0; j < m_length-i-1; j++) {
            temp = m[i][j];
            m[i][j] = m[m_length-1-j][m_length-1-i];
            m[m_length-1-j][m_length-1-i] = temp;
        }
    }
}