Const
t,b,l,r
四个边界分别代表上、下、左、右,同时也代表一个圈,每次将整个圈遍历完,然后更新边界,缩小这个圈。// 标记解法
function spiralOrder(matrix: number[][]): number[] {
const ans: number[] = [];
const m = matrix.length;
const n = matrix[0].length;
const visit = (i: number, j: number) => {
if (matrix[i][j] !== Infinity) {
ans.push(matrix[i][j]);
matrix[i][j] = Infinity;
}
};
let t = 0;
let b = m - 1;
let l = 0;
let r = n - 1;
while (t <= b && l <= r) {
for (let i = l; i <= r; i++) {
visit(t, i);
}
t++;
for (let i = t; i <= b; i++) {
visit(i, r);
}
r--;
for (let i = r; i >= l; i--) {
visit(b, i);
}
b--;
for (let i = b; i >= t; i--) {
visit(i, l);
}
l++;
}
return ans;
};
// 不标记解法
function spiralOrder1(matrix: number[][]): number[] {
const ans: number[] = [];
const m = matrix.length;
const n = matrix[0].length;
let t = 0;
let b = m - 1;
let l = 0;
let r = n - 1;
while (t <= b && l <= r) {
for (let i = l; i <= r; i++) {
ans.push(matrix[t][i]);
}
t++;
for (let i = t; i <= b; i++) {
ans.push(matrix[i][r]);
}
r--;
for (let i = r; i >= l; i--) {
ans.push(matrix[b][i]);
}
b--;
for (let i = b; i >= t; i--) {
ans.push(matrix[i][l]);
}
l++;
}
return ans;
};
54.螺旋矩阵
给你一个 m 行 n 列的矩阵
matrix
,请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:
输入:
输出:
[1,2,3,6,9,8,7,4,5]
示例 2:
输入:
输出:
[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