剑指 Offer 第29题:顺时针打印矩阵

2022-07-19  本文已影响0人  放开那个BUG

1、前言

题目描述

2、思路

没什么别的好办法,就是模拟上下左右的运动,一般满了就可以提前判断退出

3、代码

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if(matrix == null || matrix.length == 0){
            return new int[]{};
        }

        // 1,2,3,1
        // 4,5,6,1
        // 7,8,9,1
        int m = matrix.length, n = matrix[0].length;
        int[] res = new int[m * n];
        boolean[][] visited = new boolean[m][n];
        int i = 0, j = 0, index = 0;
        while(!visited[i][j] || index < m * n){
            // 左到右
            while(j < n && !visited[i][j]){
                visited[i][j] = true;
                res[index++] = matrix[i][j++];
            }

            if(index >= m * n){
                break;
            }

            j--;
            i++;
            // 上到下
            while(i < m && !visited[i][j]){
                visited[i][j] = true;
                res[index++] = matrix[i++][j];
            }

            if(index >= m * n){
                break;
            }

            j--;
            i--;
            // 右到左
            while(j >= 0 && !visited[i][j]){
                visited[i][j] = true;
                res[index++] = matrix[i][j--];
            }

            if(index >= m * n){
                break;
            }

            j++;
            i--;
            // 下到上
            while(i >= 0 && !visited[i][j]){
                visited[i][j] = true;
                res[index++] = matrix[i--][j];
            }

            if(index >= m * n){
                break;
            }

            i++;
            j++;
        }

        return res;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读