Skip to content

算法 - 螺旋矩阵

javascript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
let matrix = [
    [1, 2, 3, 8],
    [4, 5, 6, 9],
    [7, 8, 9, 10],
];
if (!matrix.length) {
    console.log([]);
}
let l = 0, r = matrix[0].length - 1; // 左、右边界索引
let t = 0, b = matrix.length - 1; // 上、下边界索引
const res = [];
while (true) {
    // 1. 从左到右遍历上边
    for (let i = l; i <= r; i++)
        res.push(matrix[t][i]);
    t++; // 上边界下移
    if (t > b)
        break; // 判断是否越界,越界则遍历完成
    // 2. 从上到下遍历右边
    for (let i = t; i <= b; i++)
        res.push(matrix[i][r]);
    r--; // 右边界左移
    if (l > r)
        break;
    // 3. 从右到左遍历下边
    for (let i = r; i >= l; i--)
        res.push(matrix[b][i]);
    b--; // 下边界上移
    if (t > b)
        break;
    // 4. 从下到上遍历左边
    for (let i = b; i >= t; i--)
        res.push(matrix[i][l]);
    l++; // 左边界右移
    if (l > r)
        break;
}
console.log(res);
typescript
 let matrix = [
    [1, 2, 3,8],
    [4, 5, 6,9],
    [7, 8, 9,10],
];
 
 if (!matrix.length){
    console.log([])
  
 }
    let l = 0, r = matrix[0].length - 1; // 左、右边界索引
    let t = 0, b = matrix.length - 1;   // 上、下边界索引
    const res = [];

    while (true) {
        // 1. 从左到右遍历上边
        for (let i = l; i <= r; i++) res.push(matrix[t][i]);
        t++; // 上边界下移
        if (t > b) break; // 判断是否越界,越界则遍历完成

        // 2. 从上到下遍历右边
        for (let i = t; i <= b; i++) res.push(matrix[i][r]);
        r--; // 右边界左移
        if (l > r) break;

        // 3. 从右到左遍历下边
        for (let i = r; i >= l; i--) res.push(matrix[b][i]);
        b--; // 下边界上移
        if (t > b) break;

        // 4. 从下到上遍历左边
        for (let i = b; i >= t; i--) res.push(matrix[i][l]);
        l++; // 左边界右移
        if (l > r) break;
    }
    console.log(res)

源码地址