这道题是比较简单的数组操作,按螺旋顺序把数组读取并且放到结果数组中即可。基本思路跟Rotate Image有点类似,就是一层一层的处理,每一层都是按照右下左上的顺序进行读取就可以。实现中要注意两个细节,一个是因为题目中没有说明矩阵是不是方阵,因此要先判断一下行数和列数来确定螺旋的层数。另一个是因为一层会占用两行两列,如果是单数的,最后要将剩余的走完。所以最后还要做一次判断。因为每个元素访问一次,所以时间复杂度是O(m*n),m,n是分别是矩阵的行数和列数,空间复杂度是O(1)。代码如下:
public ArrayList<Integer> spiralOrder(int[][] matrix) { ArrayList<Integer> res = new ArrayList<Integer>(); if(matrix == null || matrix.length==0 || matrix[0].length==0) return res; int min = Math.min(matrix.length, matrix[0].length); int levelNum = min/2; for(int level=0;level<levelNum;level++) { for(int i=level;i<matrix[0].length-level-1;i++) { res.add(matrix[level][i]); } for(int i=level;i<matrix.length-level-1;i++) { res.add(matrix[i][matrix[0].length-1-level]); } for(int i=matrix[0].length-1-level;i>level;i--) { res.add(matrix[matrix.length-1-level][i]); } for(int i=matrix.length-1-level;i>level;i--) { res.add(matrix[i][level]); } } if(min%2==1) { if(matrix.length < matrix[0].length) { for(int i=levelNum; i<matrix[0].length-levelNum;i++) { res.add(matrix[levelNum][i]); } } else { for(int i=levelNum; i<matrix.length-levelNum;i++) { res.add(matrix[i][levelNum]); } } } return res; }因为这道题是比较简单的题目,所以上面提到的两个细节还是比较重要的,面试中遇到了一定要注意,尽量做到没有bug哈。
should be O(m*n)
回复删除What a mistake! I have fixed it. Thank you so much for your reminder.
删除