1.想法:
对于矩阵的螺旋我们可以规约为4个方向
我们使用0代表向右,1代表向下,2代表向左,3代表向上
那么可以得出向右的时候是y坐标++,同理可得其他方向
我们的两条准则:
1.我们遇到数组边界或者已经被遍历过了的数就换方
2.当换了方向的第一个数已经被遍历过说明整个数组被遍历了
2.代码:
List<Integer> result = new ArrayList<>();
if(matrix.length == 0) return result;
int[][] flag = new int[matrix.length][matrix[0].length];
int direction = 0;//0:代表了向右1:代表了向下2:代表了向左,3:代表了向上
int x=0,y=0;//现在所在的位置
while (x>-1&&y>-1&&x<matrix.length&&y<matrix[0].length&&flag[x][y]!=1){ //下一方向的起始位置没有被遍历过
switch (direction%4){
case 0:
while(y<matrix[0].length&&flag[x][y] == 0){
result.add(matrix[x][y]);
flag[x][y] = 1;
y++;
}
y--; //返回上一个没有越界的位置
x++; //开启下一个位置
break;
case 1:
while(x<matrix.length&&flag[x][y] == 0){
result.add(matrix[x][y]);
flag[x][y] = 1;
x++;
}
x--; //返回上一个没有越界的位置
y--; //开启下一个位置
break;
case 2:
while (y>-1&&flag[x][y] == 0){
result.add(matrix[x][y]);
flag[x][y] = 1;
y--;
}
y++;
x--;
break;
case 3:
while(x>-1&&flag[x][y] == 0){
result.add(matrix[x][y]);
flag[x][y] = 1;
x--;
}
x++; //返回上一个没有越界的位置
y++; //开启下一个位置
break;
}
direction++;
}
return result;
网友评论