leetcode_rust/
spiral_matrix.rs

1#![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}