leetcode_rust/
diagonal_traverse.rs1#![allow(dead_code)]
2
3pub fn find_diagonal_order(matrix: Vec<Vec<i32>>) -> Vec<i32> {
11 if matrix.is_empty() {
12 return vec![];
13 }
14 let mut i = 0;
15 let mut j = 0;
16 let mut res = vec![];
17 let m = matrix.len();
18 let n = matrix[0].len();
19 let mut up = true;
20 let level = m + n - 2;
21 while i + j < level {
22 res.push(matrix[i][j]);
23
24 if up {
25 if j == n - 1 {
26 i += 1;
27 up = !up;
28 } else if i == 0 {
29 j += 1;
30 up = !up;
31 } else {
32 i -= 1;
33 j += 1;
34 }
35 } else {
36 if i == m - 1 {
37 j += 1;
38 up = !up;
39 } else if j == 0 {
40 i += 1;
41 up = !up;
42 } else {
43 i += 1;
44 j -= 1;
45 }
46 }
47 }
48 res.push(matrix[i][j]);
49
50 res
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56
57 #[test]
58 fn test1() {
59 assert_eq!(
60 find_diagonal_order(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]),
61 vec![1, 2, 4, 7, 5, 3, 6, 8, 9]
62 );
63
64 assert_eq!(
65 find_diagonal_order(vec![vec![1, 2], vec![3, 4], vec![5, 6]]),
66 vec![1, 2, 3, 5, 4, 6]
67 );
68 }
69}