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

2. 解法

2.1 Java

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        // 空值处理
        if(matrix.length==0) 
            return new int[0];

        // 初始化边界和结果数组
        int left = 0, right = matrix[0].length - 1;
        int top = 0, bottom = matrix.length - 1;
        int[] res = new int[matrix[0].length * matrix.length];

        // 结果数组下标
        int index = 0;
        // 按照方向进行打印
        while (true) {
            // 从左到右
            // 1. 按照边界打印
            for (int i=left;i<=right;i++)
                res[index++] = matrix[top][i];
            // 2. 上边界收缩(下移)
            top++;
            // 3. 判断收缩后的上边界和下边界是否相遇
            if (top > bottom)
                break;

            // 从上到下
            // 1. 按照边界打印
            for (int i=top;i<=bottom;i++)
                res[index++] = matrix[i][right];
            // 2. 右边界收缩(左移)
            right--;
            // 3. 判断收缩后的右边界和左边界是否相遇
            if (left > right)
                break;

            // 从右到左
            // 1. 按照边界打印
            for (int i=right;i>=left;i--)
                res[index++] = matrix[bottom][i];
            // 2. 下边界收缩(上移)
            bottom--;
            // 3. 判断收缩后的下边界和上边界是否相遇
            if (top > bottom)
                break;

            // 从下到上
            // 1. 按照边界打印
            for (int i=bottom;i>=top;i--)
                res[index++] = matrix[i][left];
            // 2. 左边界收缩(右移)
            left++;
            // 3. 判断收缩后的左边界和右边界是否相遇
            if(left > right) 
                break;
        }
        return res;

    }
}

2.2 Kotlin

class Solution {
    fun spiralOrder(matrix: Array<IntArray>): IntArray {
        // 空值处理
        if(matrix.size==0) 
            return IntArray(0)

        // 初始化边界和结果数组
        var left = 0
        var right = matrix[0].size - 1
        var top = 0
        var bottom = matrix.size - 1
        var res = IntArray(matrix[0].size * matrix.size)

        // 结果数组下标
        var index = 0
        while (true) {
            // 从左到右
            // 1. 按照边界打印
            for (i in left..right)
                res[index++] = matrix[top][i]
            // 2. 上边界收缩(下移)
            top++
            // 3. 判断收缩后的上边界和下边界是否相遇
            if (top > bottom)
                break

            // 从上到下
            // 1. 按照边界打印
            for (i in top..bottom)
                res[index++] = matrix[i][right];
            // 2. 右边界收缩(左移)
            right--
            // 3. 判断收缩后的右边界和左边界是否相遇
            if (left > right)
                break

            // 从右到左
            // 1. 按照边界打印
            for (i in right downTo left)
                res[index++] = matrix[bottom][i]
            // 2. 下边界收缩(上移)
            bottom--
            // 3. 判断收缩后的下边界和上边界是否相遇
            if (top > bottom)
                break

            // 从下到上
            // 1. 按照边界打印
            for (i in bottom downTo top)
                res[index++] = matrix[i][left]
            // 2. 左边界收缩(右移)
            left++
            // 3. 判断收缩后的左边界和右边界是否相遇
            if(left > right) 
                break
        }
        return res
    }
}

3. 参考

最后更新于