import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param matrix int整型二维数组
     * @return int整型一维数组
     */
    public int[] spiral_order (int[][] matrix) {
        // 首先判断矩阵是否为空,如果为空则直接返回空数组
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return new int[0];
        }

        int m = matrix.length; 
        int n = matrix[0].length; 
        int[] result = new int[m * n]; 
        int count = 0; // 用于记录结果数组的索引
        int rowBegin = 0; // 当前螺旋的起始行索引
        int rowEnd = m - 1; // 当前螺旋的终止行索引
        int colBegin = 0; // 当前螺旋的起始列索引
        int colEnd = n - 1; // 当前螺旋的终止列索引

        while (rowBegin <= rowEnd && colBegin <= colEnd) {
            // 从左到右遍历当前螺旋的上边界
            for (int j = colBegin; j <= colEnd; j++) {
                result[count++] = matrix[rowBegin][j];
            }
            rowBegin++; // 上边界向下收缩

            // 从上到下遍历当前螺旋的右边界
            for (int i = rowBegin; i <= rowEnd; i++) {
                result[count++] = matrix[i][colEnd];
            }
            colEnd--; // 右边界向左收缩

            // 判断是否还有剩余行和列
            if (rowBegin <= rowEnd) {
                // 从右到左遍历当前螺旋的下边界
                for (int j = colEnd; j >= colBegin; j--) {
                    result[count++] = matrix[rowEnd][j];
                }
            }
            rowEnd--; // 下边界向上收缩

            // 判断是否还有剩余列
            if (colBegin <= colEnd) {
                // 从下到上遍历当前螺旋的左边界
                for (int i = rowEnd; i >= rowBegin; i--) {
                    result[count++] = matrix[i][colBegin];
                }
            }
            colBegin++; // 左边界向右收缩
        }

        return result;
    }
}

本题知识点分析:

1.数学模拟

2.矩阵

3.数组遍历

本题解题思路分析:

1.从左到右遍历当前螺旋的上边界,上边界向下收缩

2.从上到下遍历当前螺旋的右边界,右边界向左收缩

3.判断是否还有剩余行和列,从右到左遍历当前螺旋的下边界,下边界向上收缩

4.判断是否还有剩余列,从下到上遍历当前螺旋的左边界,左边界向右收缩

5.最后返回顺时针得到的result数组即可

本题使用编程语言: Java

如果您觉得本篇文章有帮助的话,可以点个赞,支持一下,感谢~