天天一道Rust-LeetCode(2019-06-06)

天天一道Rust-LeetCode(2019-06-02) Z 字形變換

堅持天天一道題,刷題學習Rust.
原題git

題目描述

示例:github

輸入: 3
輸出: 5
解釋:
給定 n = 3, 一共有 5 種不一樣結構的二叉搜索樹:學習

1 3 3 2 1
  / / /   3 2 1 1 3 2
/ /   2 1 2 3code

解題過程

思路:
搜索樹的特色就是左小右大
所以:
這是一個純計算的過程,都不用模擬二叉樹
1...n
G[i]表示有i個節點的二叉樹有多少種
G[N]=G[0]G[N-1]+G[1]G[N-2]+G[2]*[N-3]+....
考慮1作定點的狀況主要考慮右邊N-1個節點的各類組合怎麼掛在1的右子樹
考慮2作頂點的狀況,左邊是一個節點的子樹,右邊是n-2個節點的子樹
兩個總數相乘就是全部可能的組合.leetcode

struct Solution {}
impl Solution {
    pub fn num_trees(n: i32) -> i32 {
        if n <= 1 {
            return n;
        }
        let mut v = vec![0; (n + 1) as usize];
        v[0] = 1;
        v[1] = 1;
        return Solution::num_trees_internal(n as usize, &mut v);
    }
    pub fn num_trees_internal(n: usize, v: &mut Vec<i32>) -> i32 {
        if v[n] > 0 {
            return v[n];
        }
        let mut sum = 0;
        for i in 0..n {
            v[i] = Solution::num_trees_internal(i, v);
            v[n - i - 1] = Solution::num_trees_internal(n - i - 1, v);
            sum += v[i] * v[n - i - 1];
        }
        sum
    }
}
#[cfg(test)]
mod test {
    use super::*;
    #[test]
    fn test_num_trees() {
        assert_eq!(1, Solution::num_trees(1));
        assert_eq!(2, Solution::num_trees(2));
        assert_eq!(5, Solution::num_trees(3));
    }
}

一點感悟

動態規劃是自底向上,針對這種狀況很是簡單,記錄下來,避免反覆計算.get

其餘

歡迎關注個人github,本項目文章全部代碼均可以找到.it

相關文章
相關標籤/搜索