题解 | #螺旋矩阵#
螺旋矩阵
http://www.nowcoder.com/practice/7edf70f2d29c4b599693dc3aaeea1d31
1、双指针、模拟
时间复杂度O(nm),空间复杂度O(nm)保存结果所用到的空间大小
import java.util.*;
public class Solution {
public ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> res = new ArrayList();
if(matrix.length==0){
return res;
}
int n = matrix.length;
int m = matrix[0].length;
//定义按顺序走的方向,向右,向下,向左,向上
int[][] path = {{0,1},{1,0},{0,-1},{-1,0}};
//定义走动的指针,i代表横坐标,j代表纵坐标
int i = 0;
int j = 0;
//index代表着轮到path第几步了
int index = 0;
//arr代表着当前走的方向
int[] arr=path[0];
//记录走过的节点,什么时候会出现重复走的呢?
//假设是{{1,2,3},{4,5,6},{7,8,9}}
//走1 2 3 6 9 8 7 4 下一个是不是又能走到1,那是不是不能走过去要在4的时候换方向呢?
boolean[][] check = new boolean[n][m];
while(res.size()<m*n){//判断条件是集合中没存满这么多元素的时候就得继续遍历
res.add(matrix[i][j]);
check[i][j]=true;
//更新下标
i+=arr[0];
j+=arr[1];
//如果更新的下标超过范围或者是走过的是不是就得更改方向?
if(i>n-1||i<0||j>m-1||j<0||check[i][j]){
//值得注意的是这一步,i,j已经是错误的节点了才进入的这个条件中,如果不返回上一步,直接做方向的转变是不是就沿着错误的节点改变方向了?
//所以这里要做减法是退回上一步没有错误之前
i-=arr[0];
j-=arr[1];
//更新index是该走哪个方向了
index = (index+1)%4;
//选择走的方向
arr = path[index];
//沿着当前方向走
i+=arr[0];
j+=arr[1];
}
}
return res;
}
}
