【Java题解】剑指 Offer 29. 顺时针打印矩阵

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

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

限制:

0 <= matrix.length <= 100
0 <= matrix[i].length <= 100

方法一:
模拟遍历。
使用四个指针,左l,右r,上t,下b来控制遍历矩阵的方向。
可以认为是四排指针,它们中间包裹的就是还没有遍历的元素,并且要按照。
1.左-右
2.上-下
3.右-左
4.下-上
来遍历,直到这四排指针中间的元素没了,就不用遍历了。返回结果即可。

代码:

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        // 模拟遍历
        if (matrix.length == 0) return new int[0];
        int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1;
        int[] res = new int[(r + 1) * (b + 1)];
        int idx = 0;
        while (true) {
            for (int i = l; i <= r; i++) res[idx++] = matrix[t][i];
            if (++t > b) break;
            for (int i = t; i <= b; i++) res[idx++] = matrix[i][r];
            if (--r < l) break;
            for (int i = r; i >= l; i--) res[idx++] = matrix[b][i];
            if (--b < t) break;
            for (int i = b; i >= t; i--) res[idx++] = matrix[i][l];
            if (++l > r) break; 
        }
        return res;
    }
}

时间复杂度:O(m * n) 遍历数组。
空间复杂度:O(1) 使用常数的额外空间,返回的空间不计算空间复杂度。

你可能感兴趣的:(力扣,矩阵,java,线性代数)