题解 | #螺旋矩阵#
螺旋矩阵
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; } }