zoukankan      html  css  js  c++  java
  • Leetcode 96. Unique Binary Search Trees

    96. Unique Binary Search Trees

    • Total Accepted: 91481
    • Total Submissions: 238129
    • Difficulty: Medium

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

    For 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

    思路:本质是DP。假设n个结点产生的二叉查找树的个数为f[n]。

    f[0]=1

    n个结点的时候

    根结点为1,这时有f[0]*f[n-1]种情况

    根结点为2,这时有f[1]*f[n-2]种情况

    根结点为3,这时有f[2]*f[n-3]种情况

    ...

    根结点为n-1,这时有f[n-2]*f[1]种情况

    根结点为n,这时有f[n-1]*f[0]种情况

    所以总共有f[n]=f[0]*f[n-1]+f[1]*f[n-2]+f[3]*f[n-3]+...+f[n-3]*f[3]+f[n-2]*f[1]+f[n-1]*f[0]。(n>=2)

    其实上面的f[n]所形成的序列就是Catalan number,公式是C(2n,n)/(n+1)。这就是方法二。不过用数学公式计算的时候,要注意整数相除和溢出问题。

    代码:

    方法一:直接计算。

     1 class Solution {
     2 public:
     3     int numTrees(int n) {
     4         vector<int> nums(n+1,0);
     5         nums[0]=1;
     6         int res=1;
     7         for(int i=1;i<=n;i++){
     8             for(int j=0;j<i;j++){
     9                 nums[i]+=nums[j]*nums[i-1-j];
    10             }
    11         }
    12         return nums[n];
    13     }
    14 };

    方法二:用Catalan number公式计算。注意整数相除和溢出问题

     1 class Solution {
     2 public:
     3     int numTrees(int n) {
     4         long long ans=1,i;//注意溢出问题
     5         for(i=1;i<=n;i++){
     6             ans=ans*(n+i)/i;
     7         }
     8         return ans/i;
     9     }
    10 };
  • 相关阅读:
    JSP中自动刷新
    JSP点击计数器
    JSP页面重定向
    JSP处理日期
    Mybatis Generator生成数据库自带的中文注释
    GMT与Etc/GMT地区信息的时区转换
    《Redis入门指南》第2版 读书笔记
    ConcurrentHashMap
    应用服务器性能优化 之 消息队列(MQ:Message Queue)
    TabLayout让Fragment在ViewPager中的滑动切换更优雅
  • 原文地址:https://www.cnblogs.com/Deribs4/p/5751739.html
Copyright © 2011-2022 走看看