剑指 Offer(22)——顺时针打印矩阵

140 阅读2分钟

这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战

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

示例 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]

思路 螺旋的矩阵有四个方向

每一个方向只要超出,则说明从该方向率先走完矩阵,遍历的出口条件为此

四个方向 从左到右 left -> right 走完之后向下移动 up++ 从上到下 up -> down 走完之后向左移动 right-- 从右到左 right -> left 走完之后向上移动 down-- 从下到上 down -> up 走完之后向右移动 left++ 此为一轮

题目描述:输入一个矩阵,按照从外向里以顺时针打印出每一个数字,例如:输入如下矩阵,则依次打印出的数字为:1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10.

思路分析:当我们顺时针打印该矩阵时,每一圈的起始位置是左上角的元素,并且每一圈左上角元素都有一个共同点:它的行和列所对应的的下标都是相同的。因此不难想到,该矩阵打印结束的条件就是左上角的元素下标走到了该矩阵行和列的一半时该矩阵也就打印结束了。因为矩阵也是用下标来确定某个数字的,所以这里就是:4>1*2

可是,我们上面给的矩阵很特殊,并且行和列的都是偶数个,不具有说服力,我们还需要考虑考虑其他的情况,以验证我们得到的结论是否具有普遍性。例如:一个77的矩阵,将该矩阵打印结束的条件就是:左上角的元素为(3,3)时,也就是说7>32

代码

var spiralOrder = function(matrix) {
    if(matrix.length === 0){
        return []
    }
    let left = 0, right = matrix[0].length - 1, up = 0, down = matrix.length - 1;
    let result = [];
    while(up <= down && left <= right){
        for(let i = left; i <= right && up <= down; i++){
            result.push(matrix[up][i]);
        }
        up++;
        for(let i = up; i <= down && left <= right; i++){
            result.push(matrix[i][right]);
        }
        right--;
        for(let i = right; i >= left && up <= down; i--){
            result.push(matrix[down][i]);
        }
        down--;
        for(let i = down; i >= up  && left <= right; i--){
            result.push(matrix[i][left]);
        }
        left++;
    }
    return result
};