54.螺旋矩阵
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
按层遍历
可以将矩阵看成若干层,首先输出最外层的元素,其次输出次外层的元素,直到输出最内层的元素。
对于每层,从左上方开始以顺时针的顺序遍历所有元素,假设当前层的左上角位于(top,left),右下角位于(bottom,right),按照如下顺序遍历当前层的元素
1.从左到右遍历上侧元素,依次为(top,left)到(top,right)
2.从上到下遍历右侧元素,依次为(top+1,right)到(bottom,right)
3.如果left<right且top<bottom,则从右到左遍历下侧元素,依次为(bottom,right-1)到(bottom,left+1),以及从下到上遍历左侧元素,依次为(bottom,left)到(top+1,left)
遍历完当前层的元素之后,将left和top分别加1,将right和bottom分别减1,进入下一层继续遍历,直到遍历完所有元素为止。
class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res = new ArrayList<Integer>();if(matrix == null|| matrix.length == 0 || matrix[0].length == 0){return res;}int rows = matrix.length,columns = matrix[0].length;int left = 0,right = columns -1,top = 0,bottom = rows-1;while(left<=right && top<=bottom){for(int column = left;column<=right;column++){res.add(matrix[top][column]); //从左到右}for(int row = top + 1;row<=bottom;row++){res.add(matrix[row][right]); //从上到下}if(left < right && top <bottom){for(int column = right -1;column > left;column--){res.add(matrix[bottom][column]); //从右到左}for(int row = bottom;row > top;row--){res.add(matrix[row][left]); //从下到上}}left++;right--;top++;bottom--;}return res;}
}
看到一个巧妙的解法:使用旋转数组
public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res = new ArrayList<>();while (matrix.length>=1){for (int num : matrix[0]) {res.add(num);}matrix=reversalArr(matrix);}return res;}private int[][] reversalArr(int[][] matrix) {int m = matrix[0].length;int n = matrix.length - 1;int[][] reArr = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {reArr[i][j]=matrix[j+1][m-i-1];}}return reArr;}