描述
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
数据范围:0≤n,m≤100 \le n,m \le 100≤n,m≤10,矩阵中任意元素都满足 ∣val∣≤100|val| \le 100∣val∣≤100
要求:空间复杂度 O(nm)O(nm)O(nm) ,时间复杂度 O(nm)O(nm)O(nm)
示例1
输入:
[[1,2,3],[4,5,6],[7,8,9]]
返回值:
[1,2,3,6,9,8,7,4,5]
示例2
输入:
[]
返回值:
[]
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> list = new ArrayList<>();
if(matrix == null || matrix.length <= 0 || matrix[0].length <= 0)
return list;
int m = matrix.length;
int n = matrix[0].length;
// 计算需要循环的次数
int time = (Math.min(m, n) + 1) / 2;
int x = 0, y = 0;
for(int i = 0; i < time; i++){
x = i;
y = i;
int startx = x;
int starty = y;
int endx = m - x - 1;
int endy = n - y - 1;
// 只有一列或者一行
if(m == 1 || n == 1){
if(m == 1){
for(int j = 0; j < n; j++)
list.add(matrix[0][j]);
}
else if(n == 1){
for(int j = 0; j < m; j++)
list.add(matrix[j][0]);
}
continue;
}
if(x == endx && y == endy){
list.add(matrix[x][y]);
continue;
}
while(y < endy){
list.add(matrix[x][y]);
y++;
}
while(x < endx){
list.add(matrix[x][y]);
x++;
}
while(y > starty){
list.add(matrix[x][y]);
y--;
}
while(x > startx){
list.add(matrix[x][y]);
x--;
}
}
return list;
}
}