54螺旋矩阵

题目:

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。


输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:


输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

let matrix = [[1,2,3,4],
              [5,6,7,8],
              [9,10,11,12],
              [13,14,15,16]]
// --------方法一【转换方向,当越界或者已经遍历过就顺时针变换方向】----------
let m = matrix.length
let n = matrix[0].length
// used:用来记录哪些地方已经遍历过了
let used = Array(m).fill().map((val)=>{
    return Array(n).fill(false)
})
let totol = m*n
// index:记录正在朝着哪个方向前进
let index = 0
let direction = [[0,1],[1,0],[0,-1],[-1,0]]
let queue = []
// i,j此时遍历的坐标
let i = 0
let j = 0
queue.push(matrix[0][0])
used[0][0]= true
for(let k = 0;k<totol-1;k++){
  let [now_i,now_j]=direction[index]
  if(i+now_i<0||i+now_i>=m||j+now_j<0||j+now_j>=n||used[i+now_i][j+now_j]){
    // 越界或前方已经遍历过就要掉转方向
    index= (index+1)%4
    now_i = direction[index][0]
    now_j = direction[index][1]
  }

  queue.push(matrix[i+now_i][j+now_j])
  used[i+now_i][j+now_j] = true
  i=i+now_i
  j=j+now_j
}
console.log(queue);
// -------方法二【一层一层循环】-------------
let matrix = [[1,2,3,4],
              [5,6,7,8],
              [9,10,11,12]]
let m = matrix.length
let n = matrix[0].length
let top = 0
let bottom = m-1
let left = 0
let right = n-1
let index = Math.ceil(Math.min(m,n)/2)
let used = Array(m).fill().map((val)=>{
    return Array(n).fill(false)
})
let queue=[]
while(index>0){
  for(let i = left;i<=right;i++){
    if(used[top][i]){
      continue
    }
    queue.push(matrix[top][i])
    used[top][i]=true
  }
  for(let i = top+1;i<=bottom;i++){
    if(used[i][right]){
      continue
    }
    queue.push(matrix[i][right])
    used[i][right]=true
  }
  for(let i = right-1;i>=left;i--){
    if(used[bottom][i]){
      continue
    }
    queue.push(matrix[bottom][i])
    used[bottom][i]=true
  }
  for(let i = bottom-1;i>top;i--){
    if(used[i][left]){
      continue
    }
    queue.push(matrix[i][left])
    used[i][left] = true
  }
  index--
  top++
  bottom--
  right--
  left++
}
console.log(queue);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值