leetcode_rust/
spiral_matrix.rs1#![allow(dead_code)]
2
3pub fn spiral_order(matrix: Vec<Vec<i32>>) -> Vec<i32> {
4 if matrix.is_empty() {
5 return vec![];
6 }
7 if matrix[0].is_empty() {
8 return matrix.iter().map(|arr| arr[0]).collect();
9 }
10 let mut res = vec![];
11 let (height, width) = (matrix.len(), matrix[0].len());
12 let (mut x_min, mut x_max, mut y_min, mut y_max) = (0, height, 0, width);
13 loop {
14 for y in y_min..y_max {
15 res.push(matrix[x_min][y])
16 }
17 x_min += 1;
18 if x_min == x_max {
19 break;
20 }
21 for x in x_min..x_max {
22 res.push(matrix[x][y_max - 1])
23 }
24 y_max -= 1;
25 if y_min == y_max {
26 break;
27 }
28 for y in (y_min..y_max).rev() {
29 res.push(matrix[x_max - 1][y])
30 }
31 x_max -= 1;
32 if x_min == x_max {
33 break;
34 }
35 for x in (x_min..x_max).rev() {
36 res.push(matrix[x][y_min])
37 }
38 y_min += 1;
39 if y_min == y_max {
40 break;
41 }
42 }
43 res
44}
45
46#[cfg(test)]
47mod tests {
48 use super::*;
49
50 #[test]
51 fn test1() {
52 assert_eq!(
53 spiral_order(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]),
54 vec![1, 2, 3, 6, 9, 8, 7, 4, 5]
55 );
56
57 assert_eq!(spiral_order(vec![vec![3], vec![2]]), vec![3, 2]);
58
59 assert_eq!(
60 spiral_order(vec![
61 vec![1, 2, 3],
62 vec![4, 5, 6],
63 vec![7, 8, 9],
64 vec![10, 11, 12],
65 vec![13, 14, 15],
66 ]),
67 vec![1, 2, 3, 6, 9, 12, 15, 14, 13, 10, 7, 4, 5, 8, 11]
68 );
69 }
70}