矩阵的相关问题(旋转矩阵&螺旋矩阵)
旋转矩阵(将我们的数组进行旋转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)