给你一个
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]提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
主要得设置边界,把握边界的范围。可以设置left,right表示左边界和有边界(列边界);top和bottom为上边界和下边界(行边界)。然后保证左边不超过右边;上边不超过下边。每撞一次边界,对应的范围要发生改变
代码如下:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<>();
int left = 0;
int right = matrix[0].length-1;
int top = 0;
int bottom = matrix.length-1;
while(left<=right&&top<=bottom){
for(int i = left ; i <= right && top <= bottom ; i++){
res.add(matrix[top][i]);
}
top++;
for(int i =top ; i <= bottom && left <= right ; i++){
res.add(matrix[i][right]);
}
right--;
for(int i = right ; i >= left && top <= bottom ; i--){
res.add(matrix[bottom][i]);
}
bottom--;
for(int i = bottom ; i >= top && left <= right ; i--){
res.add(matrix[i][left]);
}
left++;
}
return res;
}
}
一个大佬的思路:走过的路置为0,然后拐弯的时候判断一下是不是已经走过了,如果走过了就计算一下新的方向。他的代码如下:
r, i, j, di, dj = [], 0, 0, 0, 1
if matrix != []:
for _ in range(len(matrix) * len(matrix[0])):
r.append(matrix[i][j])
matrix[i][j] = 0
if matrix[(i + di) % len(matrix)][(j + dj) % len(matrix[0])] == 0:
di, dj = dj, -di
i += di
j += dj
return r
不得不说,真的很妙!