436,剑指 Offer-顺时针打印矩阵

想了解更多数据结构以及算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。也可以扫描下面的二维码关注
在这里插入图片描述

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


示例 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 int[] spiralOrder(int[][] matrix) {
    if (matrix == null || matrix.length == 0)
        return new int[0];
    int m = matrix.length, n = matrix[0].length;
    int[] res = new int[m * n];
    int up = 0, down = m - 1, left = 0, right = n - 1, index = 0;
    while (true) {
        // 上面行,从左往右打印(行不变,改变列的下标)
        for (int col = left; col <= right; col++)
            res[index++] = matrix[up][col];
        if (++up > down)
            break;

        // 右边列,从上往下打印(列不变,改变行的下标)
        for (int row = up; row <= down; row++)
            res[index++] = matrix[row][right];
        if (--right < left)
            break;

        // 下面行,从右往左打印(行不变,改变列的下标)
        for (int col = right; col >= left; col--)
            res[index++] = matrix[down][col];
        if (--down < up)
            break;

        // 左边列,从下往上打印(列不变,改变行的下标)
        for (int row = down; row >= up; row--)
            res[index++] = matrix[row][left];
        if (++left > right)
            break;
    }
    return res;
}

再来看一种方式,就是每次打印的时候上面一行和下面一行都是完整打印,左边一列和右边一列打印的值是夹在上下两行之间的,打印一圈之后,再缩小圈的范围。和上面有一点点区别,但原理还是没变。

在这里插入图片描述

public int[] spiralOrder(int[][] matrix) {
    if (matrix == null || matrix.length == 0)
        return new int[0];
    int n = matrix.length, m = matrix[0].length;
    int[] res = new int[m * n];
    int up = 0, down = n - 1;
    int left = 0, right = m - 1;
    int total = m * n;
    int index = 0;
    while (index < total) {
        //上面,从左往右打印
        for (int j = left; j <= right && index < total; j++)
            res[index++] = matrix[up][j];
        //右边,从上往下打印(注意这里i的取值范围)
        for (int i = up + 1; i <= down - 1 && index < total; i++)
            res[index++] = matrix[i][right];
        //下边,从右往左打印
        for (int j = right; j >= left && index < total; j--)
            res[index++] = matrix[down][j];
        //左边,从下往上打印(注意这里i的取值范围)
        for (int i = down - 1; i >= up + 1 && index < total; i--)
            res[index++] = matrix[i][left];
        left++;
        right--;
        up++;
        down--;
    }
    return res;
}

总结

难度不大,控制好边界条件沿着上右下左的方向打印就行了。


在这里插入图片描述

posted @ 2020-09-17 22:02  数据结构和算法  阅读(72)  评论(0编辑  收藏  举报