剑指 Offer 29. 顺时针打印矩阵

100 阅读1分钟

剑指 Offer 29. 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例:

输入: 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]

image.png

如上图所示,左右遍历使用j变量,上下遍历使用i变量,每次遍历一个边,遍历完了一个边,则需要++一次,也就是收紧一个边

var spiralOrder = function(matrix) {
    if(!matrix.length || !matrix[0].length) return [];
    let left = 0, right = matrix[0].length - 1, top = 0, bottom = matrix.length - 1, result = [];
    while(true) {
        // 从左到右,以 left 开始,right 结束
        for(let j = left; j <= right; j++)
            result.push(matrix[top][j]);
        if(++top > bottom) break; // 该行遍历完,向下移动一行,如果上边边界大于下边边界了,遍历完成,跳出

        // 从上到下遍历,以 top 开始,bottom结束
        for(let i = top; i <= bottom; i++)
            result.push(matrix[i][right]);
        if(--right < left) break; // 该列遍历完,向左移动一行,如果右边边界小于左边边界了,遍历完成,跳出

        // 从右到左遍历,以 right 开始,left 结束
        for(let j = right; j >= left; j--)
            result.push(matrix[bottom][j]);
        if(--bottom < top) break; // 该行遍历完,向上移动一行,如果下边边界小于上边边界了,遍历完成,跳出

        // 从下到上遍历,以 bottom 开始,top 结束
        for(let i = bottom; i >= top; i--)
            result.push(matrix[i][left]);
        if(++left > right) break; // 该列遍历完,向右移动一行,如果左边边界大于右边边界了,遍历完成,跳出
    }
    return result;
};