zoukankan      html  css  js  c++  java
  • [Leetcode] Unique Binary Search Trees

    Unique Binary Search Trees 题解

    原创文章,拒绝转载

    题目来源:https://leetcode.com/problems/unique-binary-search-trees/description/


    Description

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n?

    Example

    Given n = 3, there are a total of 5 unique BST's.

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

    Solution

    
    class Solution {
    private:
        vector<int> values;
        int getValue(int index) {
            if (values[index] > 0)  // 已经计算过的不重新计算
                return values[index];
            int temp = getValue(index - 1) * 2;  // 初始值先算上位于左右边界的时候的情况
            for (int i = 1; i <= index - 2; i++) {
                temp += getValue(i - 0) * getValue(index - 1 - i); // 左侧数目乘以右侧数目
            }
            values[index] = temp;
            return temp;
        }
    public:
        int numTrees(int n) {
            if (n <= 1)
                return 1;
            if (n == 2)
                return 2;
            values = vector<int>(n + 1, 0);
            values[0] = 1;
            values[1] = 1;
            values[2] = 2;
            return getValue(n);
        }
    };
    
    
    

    解题描述

    这道题是要求,给定一个数组长度,求这个长度的数组能构建出多少棵不同的二叉查找树(BST),上面给出来的是我一开始的算法,采用递归的思想比较好理解。不过AC之后还是使用非递归的方式进行了改进,也确实因为结果数据一直是正向逐个增长的,没有乱序变化,因此不必使用递归:

    
    class Solution {
    private:
        vector<int> values;
    public:
        int numTrees(int n) {
            if (n <= 1)
                return 1;
            if (n == 2)
                return 2;
            values = vector<int>(n + 1, 0);
            values[0] = 1;
            values[1] = 1;
            values[2] = 2;
    
            int i, j;
            for (i = 3; i <= n; i++) {
                values[i] = values[i - 1] * 2;  // 初始值先算上位于左右边界的时候的情况
                for (j = 1; j <= i - 2; j++) {
                    values[i] += values[j] * values[i - 1 - j];  // 左侧数目乘以右侧数目
                }
            }
    
            return values[n];
        }
    };
    
    
  • 相关阅读:
    2013暑假集训B组训练赛第二场
    2013暑假集训B组训练赛第二场
    2013暑假集训B组训练赛第二场
    2013暑假集训B组训练赛第二场
    SPOJ ANARC05H 计数DP
    HDU 2586 LCA-Tarjan
    POJ 1330 LCA最近公共祖先 离线tarjan算法
    Codeforces 176B 经典DP
    UVA 10564 计数DP
    HDU 4901 多校4 经典计数DP
  • 原文地址:https://www.cnblogs.com/yanhewu/p/8331189.html
Copyright © 2011-2022 走看看