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;
}