完整可运行代码剑指 Offer 29. 顺时针打印矩阵

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了完整可运行代码剑指 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


核心:本质为画图推导题,将矩阵拆分为四个部分考虑,逐个击破!!!

public class 剑指Offer29_顺时针打印矩阵 {
    static class Solution {
        public int[] spiralOrder(int[][] matrix) {
            // 本质是规律题,拆分为四个部分考虑!!!
            int row = matrix.length;
            if(row == 0) return new int[0];
            int col = matrix[0].length;

            int[] res = new int[col*row];
            int num = 0;                        // res数组的下标
            int up = 0, right = col-1, down = row-1, left = 0;      // 四个坐标的参数

            while(num < col*row) {
                // 上
                for(int i = up; (i<=right) && (num<col*row); i++)   // 多加的限定条件,为了防止越界访问,单行或单列的情况
                    res[num++] = matrix[up][i];
                up++;
                // 右
                for(int i = up; (i<=down) && (num<col*row); i++)
                    res[num++] = matrix[i][right];
                right--;
                // 下
                for(int i = right; (i>=left) && (num<col*row); i--)
                    res[num++] = matrix[down][i];
                down--;
                // 左
                for(int i = down; (i>=up) && (num<col*row); i--)
                    res[num++] = matrix[i][left];
                left++;
            }
            return res;
        }
    }

    public static void main(String[] args) {
//        int[][] m = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
        // 奇数次序列
//        int[][] m = new int[][]{{1,2,3,4,5},{16,17,18,19,6},{15,24,25,20,7},{14,23,22,21,8},{13,12,11,10,9}};
        // 偶数次序列
//        int[][] m = new int[][]{{1,2,3,4},{12,13,14,5},{11,16,15,6},{10,9,8,7}};
        // 只有1个数
//        int[][] m = new int[][]{{1}};
        // 行列不等
//        int[][] m = new int[][]{{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
        // 只有一行
        int[][] m = new int[][]{{1,2,3,4}};


        Solution solution = new Solution();
        int[] nums = solution.spiralOrder(m);
        for(int i = 0; i < nums.length; i++) {
            System.out.println(nums[i] + " ");
        }
    }
}


天若有情天亦老,人间正道是沧桑。     ——教员

以上是关于完整可运行代码剑指 Offer 29. 顺时针打印矩阵的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer--29顺时针打印矩阵

剑指 Offer 29. 顺时针打印矩阵 的 详细题解

剑指offer面试题 29. 顺时针打印矩阵

剑指offer面试题 29. 顺时针打印矩阵

Java 剑指offer(29) 顺时针打印矩阵

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