博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode----96. Unique Binary Search Trees
阅读量:4112 次
发布时间:2019-05-25

本文共 908 字,大约阅读时间需要 3 分钟。

链接:

大意:

给定一个整数n,以1~n为树节点元素值构建BST。求有多少种BST

思路:

动态规划。

假设 n = k时有dp[k]种可能形式,则当n = k + 1时,对根顶点分类讨论

    1. 当根顶点为k+1时,此时左子树有k个数,右子树有0个数。而这k个数刚好是1~k,因此左子树有dp[k]种形式,而右子树为null,只有一种形式
    2. 当根顶点为k时,此时左子树有k-1个数(由于是BST,所以左子树的数为1~k-1),因此左子树有dp[k - 1]种形式;而右子树有一个数(k+1),只有一种形式
    3. 当根顶点为k-1时,此时左子树有k-2个数(1~k-2),因此左子树有dp[k-2]种形式;而右子树有2个数(k,k+1),两个数有dp[2]种形式
    4. 当根顶点为k-2时,此时左子树有k-3个数(1~k-3),因此左子树有dp[k-3]种形式;而右子树有3个数(k-1,k,k+1),三个数有dp[3]种形式
    ...
    直到根顶点为1

代码:

class Solution {    public int numTrees(int n) {        if (n <= 0)            return 0;        int[] dp = new int[n + 1]; // dp[i]:当只有i个数时,有多少种BST        dp[0] = 1;        dp[1] = 1;        int i = 2;        while (i <= n) {            int rem = i - 1;            while (rem >= 0) {                dp[i] += dp[rem] * dp[i - 1 - rem];                rem--;            }            i++;        }        return dp[n];    }}

结果:

结论:

很巧妙的一个动态规划。如果没有看 Related Topics,估计渣渣的我是难以想出的... 

 

 

转载地址:http://atesi.baihongyu.com/

你可能感兴趣的文章
Linux基础系列-DEBUG
查看>>
Linux基础系列-信号及信号处理
查看>>
Think more, do more!
查看>>
Linux子系统系列-时钟子系统
查看>>
六一悄悄的过了
查看>>
Linux子系统系列-TTY
查看>>
Linux子系统系列-PCI
查看>>
Linux子系统系列-网络
查看>>
关于Zbar和ZXing这两个无比强大的二维码和条形码识别工具
查看>>
ASIHTTPRequest类库简介和使用说明
查看>>
ios中http 和https 协议的访问
查看>>
PHP+Apache+MySQL经典搭配,创建环境一 PHP安装(转载并修改)
查看>>
PHP+Apache+MySQL经典搭配,创建环境二 Apache Web服务器安装(转载并修改)
查看>>
搭建PHP后台开发环境, XAMPP
查看>>
su和sudo的区别与使用, 如果有时提示说权限不够, 而使用sudo后也同样提示,可以试试su
查看>>
使用fedora进行Android源码的编译
查看>>
SQLite3-增删改查 转载并修改
查看>>
MPMoviePlayerViewController播放媒体文件时在ios5.0上的区别--修改
查看>>
iAd和admob混用
查看>>
UIScrollView无法响应touch事件的解决办法
查看>>