前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一天一大 leet(三角形最小路径和)难度:中等-Day20200715

一天一大 leet(三角形最小路径和)难度:中等-Day20200715

作者头像
前端小书童
发布2020-09-24 11:37:14
1780
发布2020-09-24 11:37:14
举报
文章被收录于专栏:前端小书童

题目:

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

示例:
代码语言:javascript
复制
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

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

抛砖引玉

  • 任意一个元素都可以做根节点
  • 那遍历数组,分别以每个元素作为根节点计算以其为根节点存在的不同结构树
  • 节点数量i:

i(数量)

种类

拆分

i = 0

1

i = 1

1

i = 2

2

拆分节点 0+1+1 1+1+0

i = 3

5

拆分节点 0+1+dp[2] 1+1+1 dp[2]+1+0 其中 存在左节点或者右节点是右两个节点存在的可能只有1中

i = 4

14

拆分节点 0+1+dp[3] 1+1+dp[2] dp[2]+1+1 dp[3]+1+0

i = 5

42

拆分节点 0+1+dp[4] 1+1+dp[3] dp[2]+1+dp[2] dp[3]+1+1 dp[4]+1+0

  • 总结规律():

dp[i] = dp[0]xdp[i-1] + (dp[1]xdp[i-2]) + ... + (dp[i-2]xdp[1]) + dp[i-1]*dp[0]


动态规划
  • 声明记录值dp数组
  • i<2时 填充默认值1
代码语言:javascript
复制
/**
 * @param {number} n
 * @return {number}
 */
var numTrees = function (n) {
  let dp = Array(n + 1).fill(0)
  dp[0] = 1
  dp[1] = 1
  for (let i = 2; i <= n; ++i) {
    for (let j = 1; j <= i; ++j) {
      dp[i] += dp[j - 1] * dp[i - j]
    }
  }
  return dp[n]
}
数学

dp[i] = (dp[0]xdp[i-1])x2 + (dp[1]xdp[i-2])x2+(dp[2]xdp[i-3])x2 + ... + dp[n/2]x2

dp[i] = (dp[0]xdp[i-1] + dp[1]xdp[i-2] + dp[2]xdp[i-3] + ... + dp[n/2])/2

剩下的就交给数学推导吧,数学学不好代码都敲不了,泪崩

代码语言:javascript
复制
/**
 * @param {number} n
 * @return {number}
 */
var numTrees = function (n) {
  let C = 1
  for (let i = 0; i < n; ++i) {
    C = (C * 2 * (2 * i + 1)) / (i + 2)
  }
  return C
}
递归

使用递归改写动态规划

  • dp[i],递归拆分直到小于2,小于2则该位置填充默认值1
  • dp[i]存在值则说明该节点数量计算过
代码语言:javascript
复制
/**
 * @param {number} n
 * @return {number}
 */
var numTrees = function (n) {
  let dp = Array(n + 1).fill(0)
  function dpFn(x) {
    if (x == 0 || x == 1) return (dp[x] = 1)
    if (dp[x] > 0) return dp[x]
    for (let i = 0; i < x; i++) {
      dp[x] += dpFn(i) * dpFn(x - i - 1)
    }
    return dp[x]
  }
  return dpFn(n)
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小书童 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例:
  • 抛砖引玉
    • 动态规划
      • 数学
        • 递归
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档