携手创作,共同成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
螺旋矩阵
给你一个
m
行n
列的矩阵matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
分析
- 模拟题目说的螺旋方式即可得到最终的答案
模拟
- 按照题意,矩阵从左上角开始,使用四个变量来记录当前遍历圈在整个矩阵中的情况
- 按照圈遍历,每一圈都是从左到右,从上到下,从右到左,从下到上的顺序
- 每圈遍历完,圈都往里缩一圈,可以使用四个变量来记录当前遍历圈在整个矩阵中的情况
- 根据这样的遍历规则,直到遍历完整个矩阵
代码
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function(matrix) {
let result = []
let left = 0
let right = matrix[0].length
let top = 0
let bottom = matrix.length
let size = right * bottom
while( result.length<size ){
for( let i = left ; i<= right && result.length<size ; i++ ){
result.push(matrix[top][i]);
}
top++;
for( let i = top ; i <= bottom && result.length<size ; i++ ){
result.push(matrix[i][right]);
}
right--;
for( let i = right ; i>= left && result.length<size ; i-- ){
result.push(matrix[bottom][i]);
}
bottom--;
for( let i = bottom ; i>= top && result.length<size ; i-- ){
result.push(matrix[i][left])
}
left++;
}
return result;
};
矩阵转置
- 遍历的时候,可以使用变量来控制方向,保持矩阵不变,是否可以通过改变矩阵,方向不变来遍历呢?
- 答案是可以,当保持从左到右的方向时,当从上向下遍历矩阵的时候,如果这部分矩阵向左转90度之后,就可以继续从左到右遍历,当从右到左遍历矩阵,在上次左转90度的基础上再左转90度就可以是从左到右就可以了,同样的从下向上的矩阵部分,在从上向下的时候左转90度,从右到左的时候旋转90度,这个时候再旋转90度,就可以保持从左到右了
- 矩阵转起来的时候,方向就一致了,可以类比削水果,从上开始削,刀的方向没有变化,最后削的皮试一个螺旋形状的
代码
var spiralOrder = function(matrix) {
const res = []
while(matrix.length){
const first = matrix.shift()
res.push(...first)
for(const m of matrix){
let val = m.pop()
if(val)
res.push(val)
m.reverse()
}
matrix.reverse()
}
return res
};
总结
- 螺旋的矩阵,让矩阵不变时,需要通过遍历的方向,当方向不变时,需要更改矩阵,当把矩阵转起来的时候,就打开了解决矩阵的新大门
- 今天也是有收获的一天