思路
模拟一下,整个流程就是先向右走,然后向下,然后向左,然后向上……一直循环
可以定义上下左右四个边界,上边界top初始值为0,下边界buttom初始值为二维数组的高度,左边界left初始值为0,右边界right初始值为二维数组的宽度。
向右走即为在上边界的一行从左边界走到右边界,走完后将上边界向下边界靠近top,然后向下走,
向下走即为在右边界的那列,从上边界走到下边界,走完后右边界要向左边界靠近right–,然后向左走,
向左走即为在下边界的那行,从左边界走到右边界,走完后下边界要向上边界靠近buttom,然后向上走,
向上走即为在右边界的那一列,从下边界走到上边界,走完后右边界要向左边界靠近left++,然后又向下走,循环往复
直到,左边界和右边界重合,上边界和下边界重合即走完了遍历了二维数组。
class Solution {
public int[] printMatrix(int[][] matrix) {
if(matrix.length == 0)return new int[0];
int len = matrix.length * matrix[0].length;
int[] res = new int [len];
int dir = 0; //dir表示方向,0表示向右,1表示向下,2表示向左,3表示向上
int top=0,buttom = matrix.length-1,right = matrix[0].length-1,left=0,index = 0;
while( top <= buttom && left <= right){
if(dir == 0){
for(int i=left;i<=right;i++){
res[index] = matrix[top][i];
index++;
}
top++;
dir = 1;
}
else if(dir == 1){
for(int i=top;i<=buttom;i++){
res[index] = matrix[i][right];
index++;
}
right--;
dir = 2;
}
else if(dir == 2){
for(int i=right;i>=left;i--){
res[index] = matrix[buttom][i];
index++;
}
buttom--;
dir = 3;
}
else if(dir == 3){
for(int i=buttom;i>=top;i--){
res[index] = matrix[i][left];
index++;
}
left++;
dir = 0;
}
}
return res;
}
}