因为这两题所用思路相同所以放到一起了,主要是通过模拟的方式,按照要求的路线边走边读或者边写。
- 螺旋矩阵 I
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入: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]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function(matrix) {
let t = 0, l = 0;
let b = matrix.length - 1;
let r = matrix[0].length - 1;
const len = (b+1) * (r+1);
const ans = new Array(len);
let index = 0;
while (index < len) {
for (let i = l; i <= r; i++) {
ans[index++] = matrix[t][i];
}
t++;
for (let i = t; i <= b; i++) {
ans[index++] = matrix[i][r];
}
r--;
for (let i = r; i >= l; i--) {
ans[index++] = matrix[b][i];
}
b--;
for (let i = b; i >= t; i--) {
ans[index++] = matrix[i][l];
}
l++;
}
return ans.splice(0, len);
};
- 螺旋矩阵 II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 20
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
const arr = [];
// 不能直接使用new Array创建二维数组会导致因为地址问题给arr[x][y]的值赋给这列的全部
for (let i = 0; i < n; i++) {
arr.push([]);
}
let k = 1, end = Math.pow(n, 2);
let l = 0, r = n-1, t = 0, b = n - 1;
while(k <= end) {
for (let i = l; i <= r; i++) {
arr[t][i] = k;
k++
}
t++;
for (let i = t; i <= b; i++) {
arr[i][r] = k++;
}
r--;
for (let i = r; i >= l; i--) {
arr[b][i] = k++;
}
b--;
for (let i = b; i >= t; i--) {
arr[i][l] = k++;
}
l++
}
return arr;
};