【剑指 Offer】 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

【思路】

从左到右 上边界--

从上到下 右边界--

从右到左 下边界--

从下到上 左边界--

如果上下左右边界越过了对方,就说明已经结束

【代码】

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if(matrix.length==0) return new int[0];
        int l = 0; //左边界
        int r = matrix[0].length-1; //右边界
        int t = 0; //上边界
        int b = matrix.length-1; //下边界
        List<Integer> res = new ArrayList<>();
        while(true){
            // 从top的左到右 
            for(int i=l;i<=r;i++){
                res.add(matrix[t][i]);
            }
            // 最顶一行遍历完 top要+1表示进入下一层,如果top比bottom大 说明结束了
            if(++t>b) break;

            for(int i=t;i<=b;i++)
                res.add(matrix[i][r]);
           
            if(--r<l) break;

            for(int i=r;i>=l;i--){
                res.add(matrix[b][i]);
            }
            if(--b<t) break;
            for(int i=b;i>=t;i--){
                res.add(matrix[i][l]);
            }
            if(++l>r) break;
        }
        return  res.stream().mapToInt(Integer::intValue).toArray();
    }
}

 

posted @ 2023-04-17 12:02  梦想是能睡八小时的猪  阅读(24)  评论(0)    收藏  举报