面试题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

本题就算你想出了思路,你想要完成还是有一定难度的,需要仔细考虑边界问题。
我们需要按次序打印出每个数字,那我们可以模拟一下情况,其实就是向右,向下,向左,向上依次遍历整个数组,我们需要注意的是,每次都打印一个外围矩形,其实我们只要看到起点就可以了,起点的下标是11,22,33,44,...的点。永远在对角线上,那每次遍历我们都进行加一,我们找到规律当下标值start ,start ,如果start * 2 > row || start * 2 > column 就退出循环。
在循环内遍历即可,需要注意的是,你最后一次循环,可能访问的是一行,甚至一个数字,这些都要进行考虑。

因此在访问时先要进行判断。
代码如下:

class Solution {
    int[] ans;
    int index = 0;
    public int[] spiralOrder(int[][] matrix) {
        
        if (matrix.length == 0) return new int[0];
        int row = matrix.length;
        int column = matrix[0].length;
        ans = new int[row * column];
        int start = 0;
        while ( column > 2 * start && row > 2 * start ){
            fillIn(start,matrix,row,column);
            start++;
        }
        return ans;
    }
    void fillIn(int start,int[][] matrix,int row,int column){
        
        int endX = column - start - 1;
        int endY = row - start - 1;
        //向右移动
        for (int i = start; i <= endX; i++){
            ans[index++] = matrix[start][i];
        }

        //向下移动
        for (int i = start + 1; i <= endY; i++){
            ans[index++] = matrix[i][endX];
        }
        
        //向左移动 要想有向左移动,首先要求你有向下移动否则就是重复
        if (endY > start && endX > start){
            for (int i = endX -1; i >= start; i-- ){
                ans[index++] = matrix[endY][i];
            }
        }

        //向上移动 要求有向左移动
        if (endX > start && endY > start + 1 ){
            for (int i = endY - 1; i > start; i--){
                ans[index++] = matrix[i][start];
            }
        }

    }
} 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(面试题29. 顺时针打印矩阵)