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
}