leetcode-顺时针打印矩阵
题目链接 题目
题目大意是,存在一个二维矩阵,按照顺时针的方式对于这个矩阵进行遍历,其实这个问题之前遇到过,在刘汝佳的那本书上有,而且好像是哪一次的蓝桥杯也有这个题目,那时候这道题目还叫作:蛇形填数,当时的做法好像是有一个数学规律,可以用这个规律遍历,今天又做的话好像可以有更有逻辑的方式去读。
首先来说,顺时针读取的话,存在这样的规律:从左到右–从上到下–从右到左–从下到上,可以看到的是我们可以建立四个循环分别完成这四个过程,而且每次循环的起点,终点都会随着顺时针循环的深入而发生变化。故可以进行下面的编码
//蛇形填数问题
//原来:找了个数学规律
//后来:应该是这种有规律的循环解决问题
public int[] spiralOrder(int[][] matrix) {
//特判数组是否为空
if(matrix.length == 0) return new int[0];
int m = matrix[0].length, n = matrix.length;
int[] result = new int[m*n];
//定义横向和纵向的尺寸范围
int l = 0, r = m-1, s = 0, e = n-1;
int index = 0;
while(true) {
//从左到右
for(int i = l; i <= r; i++) {
result[index++] = matrix[s][i];
}
if(s+1>e) {
break;
}else {
s++;
}
//从上到下
for(int i = s; i <= e; i++) {
result[index++] = matrix[i][r];
}
if(r-1<l) {
break;
}else {
r--;
}
//从右到左
for(int i = r; i >= l; i--) {
result[index++] = matrix[e][i];
}
if(e-1<s) {
break;
}else {
e--;
}
//从下到上
for(int i = e; i >= s; i--) {
result[index++] = matrix[i][l];
}
if(l+1>r) {
break;
}else {
l++;
}
}
return result;
}
本质上还是在用模拟的方式来解决问题,不过对于边界问题的处理比较引人入胜