其他分享
首页 > 其他分享> > 剑指 Offer 29. 顺时针打印矩阵

剑指 Offer 29. 顺时针打印矩阵

作者:互联网

1. 题目

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

2. 示例

示例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

3. 题解

其实这题相当于一个规律题,如何控制它先往右打印,接着往下打印,然后往左打印,最后往上打印。

首先,想到的是外面嵌套一个for循环,然后在里面判断,这种方式对于边界不好控制。

接着,定义四个边界,然后来控制,可行:

然后一直循环查找:

4. 实现

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        
       int row = matrix.length;
       if(row == 0) return new int[0];
       int col = matrix[0].length;
       // 定义一维数组
       int[] res = new int[row * col];
       // 定义索引
       int idx = 0;
       int left = 0, top = 0, right = col - 1, bottom = row - 1;
       while(true) {
           // 从左往右
           for(int i = left; i <= right; i++) {
               res[idx++] = matrix[top][i];
           }
           if(++top > bottom) break;
           // 从上往下
           for(int i = top; i <= bottom; i++) {
               res[idx++] = matrix[i][right];
           }
           if(--right < left) break;
           // 从右往左
           for(int i = right; i >= left; i--) {
               res[idx++] = matrix[bottom][i];
           }
           if(--bottom < top) break;
           // 从下往上
           for(int i = bottom; i >= top; i--) {
               res[idx++] = matrix[i][left];
           }
           if(++left > right) break;
       }

        return res;
    }
}

5. 结语

  努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

  如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

 

标签:顺时针,bottom,int,top,Offer,29,++,right,left
来源: https://www.cnblogs.com/haifwu/p/14979882.html