矩阵的相关问题(旋转矩阵&螺旋矩阵)

旋转矩阵(将我们的数组进行旋转90度,180度,270度)

              rotate(90deg)=>               

 旋转90度之后分析一下:旋转后的数组第一行等于原来数组的第一列。

代码如下

const arr = [
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12],
    [13,14,15,16],
    [17,18,19,20]
]

function rotate(arr) {
    let arr2 = [];
    for(let i =0; i<arr[0].length; i++) { //i是每一列的序号
        let temparr = []; //存储旋转后每一行的结果
        for(let j=0;j<arr.length; j++) { //j是每一行的序号
            temparr.unshift(arr[j][i]); //将结果从头开始一个一个插入
        }
        arr2.push(temparr)
    }
    return arr2;
}

console.log(rotate(arr)) //旋转90deg

 如果旋转180那么rotate函数调用 两遍即可。270deg以此类推

螺旋矩阵(顺时针遍历矩阵)

 分析:

1.每一轮的循环都是:向右->向下->向左->向上

2.使用四个边界l,r,t,b来限定遍历的范围

3.向左走完一遍之后,上边界下移(t++);向下走完一遍之后,右边界左移(r--);向左走完一遍之后,下边界上移(b--);向上走完一遍之后,左边界右移(l++)

3.结束条件:当左边界>=右边界&&上边界>=下边界

代码如下:

onst arr = 
[
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12],
    [13,14,15,16],
    [17,18,19,20]
]

function ergodic(arr) {
    let t = 0;
    let b = arr.length - 1;
    let l = 0;
    let r = arr[0].length - 1;
    while(l<r||t<b) {
        for(let i=l;i<=r;i++) {
            //向右
            console.log(arr[t][i]);
        }
        t++;
        for(let i = t;i<=b;i++) {
            //向下
            console.log(arr[i][r])
        }
        r--;
        for(let i=r;i>=l;i--) {
            //向左
            console.log(arr[b][i]);
        }
        b--;
        for(let i =b;i>=t;i--) {
            //向上
            console.log(arr[i][l])
        }
        l++;
    }
}

ergodic(arr)

  

原文地址:https://www.cnblogs.com/longlongdan/p/14313205.html