顺时针打印矩阵

LeetCode每日一题,面试题29.顺时针打印矩阵 LCOF

先看题目描述

题目大意就是给定一个矩阵,然后顺时针把矩阵打印出来

算法和思路

就按照从左往右,从上往下,从右往左,从下往上的顺序循环往内打印,定义一个变量 c 来记录打印到了第几层,用 count 来记录打印了多少个数字,res 来记录结果数组,用 len1 表示矩阵宽度,len2 表示矩阵高度,从左往右打印时,横坐标左边界是 c,右边界是 len1 - 1 - c;从上往下打印时,纵坐标左边界是 c,右边界是 len2 - 1 - c;横坐标从右往左打印时,从 len1 - 1 - c 打印到 c;从下往上打印时,纵坐标从 len2 - 1 -c 打印到 c,以上边界均是左开右闭。当 count 与矩阵中元素数目相等时,就表示打印完毕,返回 res 数组

注意:考虑一种特殊情况,当最后一层只剩下一个元素时,无论哪个方向的打印都不会把这个元素打印出来,故须加上一个判断,当 c = len1 - 1 -c = len2 - 1 - c时,将该元素添加到 res 数组中,再将 res 返回

算法源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix.length == 0) return new int[0];
int len1 = matrix[0].length;
if (len1 == 0) return new int[0];
int len2 = matrix.length;
int len = len1*len2;
int c = 0;
int count = 0;
int[] res = new int[len];
while(c <= len1 - 1 - c && c <= len2 - 1 - c) {
int a = len1 - 1 - c;
int b = len2 - 1 - c;
for (int i = c; i < a; i++) {
res[count] = matrix[c][i];
if (++count == len) return res;
}
for (int i = c; i < b; i++) {
res[count] = matrix[i][a];
if (++count == len) return res;
}
for (int i = a; i > c; i--) {
res[count] = matrix[b][i];
if (++count == len) return res;
}
for (int i = b; i > c; i--) {
res[count] = matrix[i][c];
if (++count == len) return res;
}
if (a == b & a == c) {
res[count] = matrix[a][a];
return res;
}
c++;
}
return res;
}
}

后来看了题解发现整体思路是差不多的,只是题解的代码中定义了四个变量表示上下左右四个边界,每循环打印一次就将边界收缩,当边界相遇时,就表示打印完毕,则跳出循环,返回结果

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix.length == 0) return new int[0];
int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1, x = 0;
int[] res = new int[(r + 1) * (b + 1)];
while(true) {
for(int i = l; i <= r; i++) res[x++] = matrix[t][i]; // left to right.
if(++t > b) break;
for(int i = t; i <= b; i++) res[x++] = matrix[i][r]; // top to bottom.
if(l > --r) break;
for(int i = r; i >= l; i--) res[x++] = matrix[b][i]; // right to left.
if(t > --b) break;
for(int i = b; i >= t; i--) res[x++] = matrix[i][l]; // bottom to top.
if(++l > r) break;
}
return res;
}
}