美文网首页
19. 顺时针打印矩阵

19. 顺时针打印矩阵

作者: 丶沧月 | 来源:发表于2019-03-13 22:38 被阅读0次

    题目描述

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

    解题思路

    循环条件怎么判定?一个矩阵,给定起点(startX,startY)和终点(endX,endY)(即位于对角线上的两个点)就可以打印一周,然后向里进一周(即++startX,++startY,--endX,--endY)即可,如果起始点坐标<终止点坐标(即startX<endX或者startY<endY)循环结束。

    给定起点和终点,打印一周的结束条件是什么?我画了三种情况的矩阵4×4矩阵,3×5矩阵,5×3矩阵(所有矩阵无非就这三种类型,正方形的,偏“胖”的,偏“瘦”的),很快发现,只有三种情况:一直循环到结束,只剩下一行,只剩下一列。所以我们的函数首先判定:只有一行?打印该行;只有一列,打印该列。都不是,打印四条边上的数字。

    代码实现

    public ArrayList<Integer> printMatrix(int[][] matrix) {
        ArrayList<Integer> ret = new ArrayList<>();
        int r1 = 0, r2 = matrix.length - 1, c1 = 0, c2 = matrix[0].length - 1;
        while (r1 <= r2 && c1 <= c2) {
            for (int i = c1; i <= c2; i++)
                ret.add(matrix[r1][i]);
            for (int i = r1 + 1; i <= r2; i++)
                ret.add(matrix[i][c2]);
            if (r1 != r2)
                for (int i = c2 - 1; i >= c1; i--)
                    ret.add(matrix[r2][i]);
            if (c1 != c2)
                for (int i = r2 - 1; i > r1; i--)
                    ret.add(matrix[i][c1]);
            r1++; r2--; c1++; c2--;
        }
        return ret;
    }
    

    相关文章

      网友评论

          本文标题:19. 顺时针打印矩阵

          本文链接:https://www.haomeiwen.com/subject/lpwxmqtx.html