Skip to content

剑指Offer&Bigo:旋转矩阵 #57

Open

Description

@sisterAn

给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。

不占用额外内存空间能否做到?

示例 1:

给定 matrix = 
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],

原地旋转输入矩阵,使其变为:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]

示例 2:

给定 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]
]

附赠leetcode地址:leetcode

Activity

  1. 7777sea commented on Jun 1, 2020

    @7777sea

    思路: 按对角线反转后再逐行倒序

    [                     
        [1,2,3],     
        [4,5,6],     =>   
        [7,8,9]
    ]
    
    [
        [1,4,7],     
        [2,5,8],     =>   
        [3,6,9]
    ]
    
    [
        [7,4,1],     
        [8,5,2],     =>   
        [9,6,3]
    ]
    
    /**
     * @param {number[][]} matrix
     * @return {void} Do not return anything, modify matrix in-place instead.
     */
    var rotate = function(matrix) {
        const n = matrix.length;
        //对角线反转 0,0  n-1,n-1
        for(let i = 0; i < n; i++) {
            for(let j = 0; j < i; j++) {
                swap(matrix, [i, j], [j, i]);
            }
        }
    
        //中线左右反转
        for(let i = 0; i < n; i++) {
            for(let j = 0; j < n / 2; j++) {
                swap(matrix, [i, j], [i, n - 1 - j]);
            }
        }
    
        function swap(matrix, [x1, y1], [x2, y2]) {
            const tmp = matrix[x1][y1];
            matrix[x1][y1] = matrix[x2][y2];
            matrix[x2][y2] = tmp;
        }
    };
  2. dinjufen commented on Jun 1, 2020

    @dinjufen
    function rotateMatrix(mat) {
      const len = mat.length
    
      for(let i = 0;i < len;i ++) {
        for (let j = i;j < len;j ++) {
          let tmp = mat[i][j]
          mat[i][j] = mat[j][i]
          mat[j][i] = tmp
        }
      }
    
      for(let i = 0;i< len;i ++) {
        for(let j = 0;j < Math.floor(len / 2);j ++) {
          let tmp = mat[i][j]
          mat[i][j] = mat[i][len - j - 1]
          mat[i][len - j - 1] = tmp
        }
      }
    }
  3. syc666 commented on Jun 1, 2020

    @syc666
    const fun = (arr) => {
        for(let i=0,len=arr.length;i<len;i++){
            for(let j=i;j<len;j++){
                const temp = arr[i][j]
                arr[i][j] = arr[j][i]
                arr[j][i] = temp
            }
        }
        arr.forEach(val=>{
            val.reverse()
        })
    }
  4. plane-hjh commented on Jun 1, 2020

    @plane-hjh
    const rotate = (matrix) =>{
        for(let i = 0; i < matrix.length; i++){
            for (let j = i; j < matrix[i].length; j++){
                [matrix[i][j],matrix[j][i]] = [matrix[j][i],matrix[i][j]]
            }
        }
        matrix.forEach(row=> row.reverse())
    };
  5. fanefanes commented on Jun 2, 2020

    @fanefanes

    思路:
    es6 结构赋值,解决 不占用额外内存空间;
    通过两个指针来实现旋转;
    /**

    • @PARAM {number[][]} matrix
    • @return {void} Do not return anything, modify matrix in-place instead.
      */
    var rotate = function(matrix) {
        const n  = matrix[0].length
        for(let i = 0 ;i<=(n/2-1);i++){
            for(let j = i; j<n-i-1; j++){
                [matrix[i][j], matrix[j][n-i-1], matrix[n-i-1][n-j-1], matrix[n-j-1][i]] =  [matrix[n-j-1][i], matrix[i][j],  matrix[j][n-i-1], matrix[n-i-1][n-j-1]] 
            }
        }
        return matrix
    };
  6. i7eo commented on Sep 3, 2020

    @i7eo

    // 思路:先转置后反转

    var rotate = function(matrix) {
        var n = matrix.length
        for(let i = 0; i< n; i++) {
            // i + 1 是为了避免不必要的交换,加快速度
            for(let j = i+1; j< n; j++){
                var temp = matrix[i][j]
                matrix[i][j] = matrix[j][i]
                matrix[j][i] = temp
            }
            // 没有这一句就是矩阵转置,加上后就是旋转矩阵。反转每一行即可达到目的
            matrix[i].reverse()
        }
        return matrix
    };
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions