剑指Offer-题29(Java版):顺时针打印矩阵

参考自:《剑指Offer——名企面试官精讲典型编程题》

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

主要思路
分4步:
第一步:从左到右打印一行;
第二步:从上到下打印一列;
第三步:从右到左打印一行;
第四步:从下到上打印一列;
其中,每一步根据起始和终止坐标打印。

每一步的前提条件:
第一步:必需的;
第二步:至少两行,即终止行号大于起始行号;
第三步:至少两行两列,即终止行号大于起始行号;且终止列号大于起始列号;
第四步:至少三行两列,即终止行号比起始行号至少大2;且终止列号大于起始列号;

关键点:每一步的前提条件

时间复杂度:O(row*column)

public class ClockwiseMatrix
{
    private static ArrayList<Integer> result;

    public static void main(String[] args)
    {
        int[][] matrix = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
        //int[][] matrix = {{1}};
        printMatrixInClockwise(matrix);
        System.out.println(result);
    }

    private static void printMatrixInClockwise(int[][] numbers)
    {
        if (numbers == null)
            return;
        int columns = numbers.length;
        if (columns == 0) return;
        int rows = numbers[0].length;
        result = new ArrayList<>();
        int start = 0;
        //完整的一圈会遍历两行两列
        while (columns > start * 2 && rows > start * 2)
        {
            printMatrixInCircle(numbers, columns, rows, start);
            ++start;
        }
    }

    private static void printMatrixInCircle(int[][] numbers, int columns, int rows, int start)
    {
        int endX = columns - 1 - start;
        int endY = rows - 1 - start;
        // 从左到右打印一行
        for (int i = start; i <= endX; ++i)
        {
            result.add(numbers[start][i]);
        }
        // 从上到下打印一列
        if (start < endY)
        {
            for (int i = start + 1; i <= endY; ++i)
            {
                result.add(numbers[i][endX]);
            }
        }
        // 从右到左打印一行
        if (start < endX && start < endY)
        {
            for (int i = endX - 1; i >= start; --i)
            {
                result.add(numbers[endY][i]);
            }
        }
        // 从下到上打印一行
        if (start < endX && start < endY - 1)
        {
            for (int i = endY - 1; i >= start + 1; --i)
            {
                result.add(numbers[i][start]);
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37862405/article/details/80243607