Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
sisterAn opened this issue May 31, 2020 · 6 comments
Open

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

sisterAn opened this issue May 31, 2020 · 6 comments

Comments

@sisterAn
Copy link
Owner

给你一幅由 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

@7777sea
Copy link

7777sea commented Jun 1, 2020

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

[                     
    [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;
    }
};

@dinjufen
Copy link

dinjufen commented Jun 1, 2020

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
    }
  }
}

@syc666
Copy link

syc666 commented Jun 1, 2020

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()
    })
}

@plane-hjh
Copy link

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())
};

@fanefanes
Copy link

思路:
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
};

@i7eo
Copy link

i7eo commented Sep 3, 2020

// 思路:先转置后反转

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
Projects
None yet
Development

No branches or pull requests

7 participants