leetcode/
pascals_triangle.rs1pub struct Solution;
25impl Solution {
26 pub fn generate(num_rows: i32) -> Vec<Vec<i32>> {
27 assert!(num_rows >= 0);
28
29 gen_pascal_triangle()
30 .take(num_rows as usize)
31 .collect()
32 }
33}
34
35fn gen_pascal_triangle() -> impl Iterator<Item = Vec<i32>> {
36 std::iter::successors(Some(vec![1]), |row| {
37 vec![1].into_iter()
38 .chain(row.windows(2).map(|v| v.iter().sum()))
39 .chain(vec![1].into_iter())
40 .collect::<Vec<i32>>()
41 .into()
42 })
43}
44
45#[cfg(test)]
46mod tests {
47 use super::*;
48
49 #[test]
50 fn test() {
51 let cases = vec![
52 (0, vec![]),
53 (1, vec![vec![1]]),
54 (2, vec![
55 vec![1],
56 vec![1,1],
57 ]),
58 (5, vec![
59 vec![1],
60 vec![1,1],
61 vec![1,2,1],
62 vec![1,3,3,1],
63 vec![1,4,6,4,1]]),
64 ];
65
66 for (num_rows, expect) in cases {
67 assert_eq!(expect, Solution::generate(num_rows));
68 }
69 }
70
71 #[test]
72 fn test_gen_pascal_triangle() {
73 let mut gen = gen_pascal_triangle();
74 assert_eq!(vec![1], gen.next().unwrap());
75 assert_eq!(vec![1,1], gen.next().unwrap());
76 assert_eq!(vec![1,2,1], gen.next().unwrap());
77 assert_eq!(vec![1,3,3,1], gen.next().unwrap());
78 assert_eq!(vec![1,4,6,4,1], gen.next().unwrap());
79 }
80}