剑指offer29(Java)-顺时针打印矩阵(简单)

发布时间 2023-03-30 10:48:49作者: 我不想一直当菜鸟

题目:

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

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

注意:本题与 力扣 54 题 相同

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

解题思路:

 ①首先需要特别判断为空的情况,对于空矩阵直接返回空数组;

②设置二维数组四个边界:l, r, t, b

  • 沿着t,从左往右遍历,遍历完后,t++;
  • 沿着r,从上往下遍历,遍历完后,r--;
  • 沿着b,从左往右遍历,注意这时候还要判断一下 t 和 b 的关系,因为在前面的循环中,t的值有变化,遍历完后,b--;
  • 沿着l,从下网上遍历,注意这时候还要判断一下 l 和 r的关系,因为在前面的循环中,r的值有变化,遍历完后,l++;

代码:

 1 class Solution {
 2     public int[] spiralOrder(int[][] matrix) {
 3         //特判
 4         if (matrix.length == 0 || matrix[0].length == 0) return new int[0];
 5         int n = matrix.length, m = matrix[0].length;
 6         int[] ans = new int[n*m];
 7         int l = 0, r = m - 1, t = 0, b = n - 1, k = 0;
 8         while (l <= r && t <= b){
 9             //从左到右
10             for (int i = l; i <= r; i++){
11                 ans[k++] = matrix[t][i];
12             }
13             t++;
14             //从上到下
15             for (int j = t; j <= b; j++){
16                 ans[k++] = matrix[j][r];
17             }
18             r--;
19             //从右到左
20             for (int i = r; i >= l && t <= b; i--){
21                 ans[k++] = matrix[b][i];
22             }
23             b--;
24             //从下到上
25             for(int j = b; j >= t && l <= r; j--){
26                 ans[k++] = matrix[j][l];
27             } 
28             l++;
29         }
30         return ans;
31     }
32 }