给你一个
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] = 0if matrix[(i + di) % len(matrix)][(j + dj) % len(matrix[0])] == 0:di, dj = dj, -dii += dij += dj
return r
不得不说,真的很妙!