数组---螺旋矩阵

54. 螺旋矩阵

给矩阵,返回遍历结果

JS实现

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function (matrix) {
  let printArr = []

  // 初始化
  let startX = 0
  let startY = 0
  let offset = 1

  // matrix只有一行或者只有一列数据的情况
  if (matrix.length === 1) {
    // 只有一行数据
    return matrix[0]
  } else if (matrix[0].length === 1) {
    // 只有一列数据
    let temp = []
    matrix.forEach((item) => {
      temp.push(...item)
    })
    return temp
  }

  // 所给矩阵的长和宽,小的一方会决定遍历的圈数
  let height = matrix.length // 宽
  let width = matrix[0].length // 长
  let temp = Math.min(height, width)
  let loop = parseInt(temp / 2)

  while (loop > 0) {
    for (var j = startY; j < width - offset; j++) {
      printArr.push(matrix[startX][j])
    }
    for (var i = startX; i < height - offset; i++) {
      printArr.push(matrix[i][j])
    }
    for (; j > startY; j--) {
      printArr.push(matrix[i][j])
    }
    for (; i > startX; i--) {
      printArr.push(matrix[i][j])
    }
    startX++
    startY++
    offset++

    // 必须要遍历到最后一次,才能进行处理
    if (loop === 1) {
      // 宽高都为奇数
      if(height % 2 !== 0 && width >= height) {
        // 宽为奇数
        for (let j = startY; j < width - offset + 1; j++) {
          printArr.push(matrix[startX][j])
        }
      } else if (width % 2 !== 0 && height >= width) {
        // 高为奇数
        for (let i = startX; i < height - offset + 1; i++) {
          printArr.push(matrix[i][startY])
        }
      }
    }

    loop--
  }
  return printArr
}

59. 螺旋矩阵 II

按要求返回矩阵

JS实现

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function (n) {
  // 生成一个n*n的空矩阵
  let matrix = Array(n)
    .fill(0)
    .map((item) => Array(n).fill(0))
  // 接下来的每一次遍历都是按照[)

  // 初始化
  let startX = 0
  let startY = 0
  let offset = 1
  let count = 1
  // 需要循环几圈
  let loop = parseInt(n / 2)

  // 排除n=1的情况
  if (n % 2 !== 0) {
    matrix[startX][startY] = count
  }

  while (loop > 0) {
    // 注意这里必须是var定义,不能用let,let定义的变量是块级作用域
    for (var j = startY; j < n - offset; j++) {
      matrix[startX][j] = count++
    }
    for (var i = startX; i < n - offset; i++) {
      matrix[i][j] = count++
    }
    for (; j > startY; j--) {
      matrix[i][j] = count++
    }
    for (; i > startX; i--) {
      matrix[i][j] = count++
    }
    startX++
    startY++
    offset++

    // 如果n是奇数,则转圈遍历后,中间正好剩余一个没有遍历
    if (n % 2 !== 0) {
      matrix[startX][startY] = count
    }
    loop--
  }

  return matrix
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值