题解:java 模拟 注释详细 逻辑简单 时间击败100%
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
1.遍历前准备,初始化相关变量,和确定遍历条件。
//初始化变量
List ans = new ArrayList<>();
int x=0,y=0,h=matrix.length-1,w=matrix[0].length-1;
//遍历条件
while (x<=w&&y<=h){
// 旋转打印数组
}
2.遍历顶部第y行,由左向右
//up由左向右
for (int i = x; i <=w ; i++) {
ans.add(matrix[y][i]);
}
//第y行已经遍历过
y++;
3.遍历右边第w列,由上向下
//right 由上向下
for (int i = y; i <=h ; i++) {
ans.add(matrix[i][w]);
}
//第w列已经遍历过
w--;
4.遍历底部h行,条件 h>=y
,顶部已经遍历的就不再遍历, 由由向左
//down 由由向左
for (int i = w; i >=x &&h>=y ; i--) {
ans.add(matrix[h][i]);
}
//第h行已经遍历过
h--;
5.遍历左边x行,条件x<=w
右边已经遍历过的不再遍历,由下向上
//left 由下向上
for (int i = h; i >=y&&x<=w ; i--) {
ans.add(matrix[i][x]);
}
//第x列已经遍历过
x++;
时间复杂度: O(n)
空间复杂度: O(n)
class Solution {
public List spiralOrder(int[][] matrix) {
List ans = new ArrayList<>();
int x=0,y=0,h=matrix.length-1,w=matrix[0].length-1;
while (x<=w&&y<=h){
//up由左向右
for (int i = x; i <=w ; i++) {
ans.add(matrix[y][i]);
}
//第y行已经遍历过
y++;
//right 由上向下
for (int i = y; i <=h ; i++) {
ans.add(matrix[i][w]);
}
//第w列已经遍历过
w--;
//down 由右向左
for (int i = w; i >=x &&h>=y ; i--) {
ans.add(matrix[h][i]);
}
//第h行已经遍历过
h--;
//left 由下向上
for (int i = h; i >=y&&x<=w ; i--) {
ans.add(matrix[i][x]);
}
//第x列已经遍历过
x++;
}
return ans;
}
}