目录
题目地址:
今天刷螺旋遍历二维数组(顺时针打印矩阵),大家有兴趣可以点上看看题目要求,试着做一下。
我们直接看题解吧:
审题目+事例+提示:
题目的意思是从一个二维数组中按照螺旋矩阵形式取出对应的元素
思路(模拟):
- 判断若数组为空,则返回一个空数组
- 初始化矩阵4个边界,上下左右t,b,l,r,以及对应的打印列表res;
- 循环遍历:即从左往右,从上到下,从右到左,从下到上
·array 数组对应的元素依次赋值到res
·边界依次缩1
·判断边界是否相遇(是否打印完毕),是则break
4. 返列表res;
代码:
class Solution {
public int[] spiralArray(int[][] array) {
if(array.length == 0) return new int[0];
int l = 0, r = array[0].length - 1, t = 0, b = array.length - 1, x = 0;
int[] res = new int[(r + 1) * (b + 1)];
while(true) {
for(int i = l; i <= r; i++) res[x++] = array[t][i]; // left to right
if(++t > b) break;
for(int i = t; i <= b; i++) res[x++] = array[i][r]; // top to bottom
if(l > --r) break;
for(int i = r; i >= l; i--) res[x++] = array[b][i]; // right to left
if(t > --b) break;
for(int i = b; i >= t; i--) res[x++] = array[i][l]; // bottom to top
if(++l > r) break;
}
return res;
}
}
相似题目对比分析:
做完这道题,再做下面这道题会对螺旋矩阵有更深理解
这两道题主要区别在于:
1、
上面这道是从一个二维数组按照螺旋矩阵形式取出对应的元素
下面这道是将一个整数按照螺旋矩阵方式放入一个二维数组中(从0开始)
2、
上面这道题的二维数组是长度n*m(即边界不等长),即对应为一个矩阵
而上面这道题二维数组是长度n*n(即边界等长),即对应为一个方阵
这也就意味着,上面这道题会出现重复打印的情况因为最后一圈有可能退化为只有一行,只有一列,甚至只有一个数, 因此要注意进行判断是否 出现相遇,越界