Given an m x n matrix, return all elements of the matrix in spiral order.
Example 1:
Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
Constraints:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 10
- -100 <= matrix[i][j] <= 100
不知道有没有其他更好的方法, 反正我只想到了用状态机来实现,记录行 index,列 index 和方向, 根据这三个变量的状态来判断下一步的方向,重点在于连续两次换向就代表了我们已经遍历完整个矩阵了,确定了这点能省很多事。
代码实现(Rust):
impl Solution {
pub fn spiral_order(mut matrix: Vec<Vec<i32>>) -> Vec<i32> {
let row_len = matrix.len();
let col_len = matrix[0].len();
let mut row = 0_usize;
let mut col = 0_usize;
let mut dir = "right";
let mut ans = Vec::new();
loop {
ans.push(matrix[row][col]);
matrix[row][col] = -101;
match dir {
"right" => {
if col == col_len - 1 || matrix[row][col+1] == -101 {
if row == row_len - 1 || matrix[row+1][col] == -101 {
break;
}
dir = "down";
row += 1;
} else {
col += 1;
}
},
"down" => {
if row == row_len - 1 || matrix[row+1][col] == -101 {
if col == 0 || matrix[row][col-1] == -101 {
break;
}
dir = "left";
col -= 1;
} else {
row += 1;
}
},
"left" => {
if col == 0 || matrix[row][col-1] == -101 {
if row == 0 || matrix[row-1][col] == -101 {
break;
}
dir = "up";
row -= 1;
} else {
col -= 1;
}
},
"up" => {
if row == 0 || matrix[row-1][col] == -101 {
if col == col_len - 1 || matrix[row][col+1] == -101 {
break;
}
dir = "right";
col += 1;
} else {
row -= 1;
}
}
_ => unreachable!()
}
}
ans
}
}