96.不同的二叉搜索树
动态规划思想解决:
重点: 假设n个节点存在二叉排序树的个数是G(n),令f(i)为以i为根的二叉搜索树的个数
则: ,这也是利用动态规划思想的核心
-
当 为根节点时,其左子树节点个数为 个,右子树节点为 ,则
-
综合两个公式可以得到 卡特兰数 公式
1 | 2 | 3 |
---|---|---|
G(1) =1 | G(2)=G(0)*G(1) + G(1)*G(0) =1+1 = 2 | G(3)=G(0)*G(2) +G(1)*G(1) + G(2)*G(0) =1*2+1*1+2*1 =5 |
# -*- coding:utf-8 -*-
# !/usr/bin/env python
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# G(n)=G(0)∗G(n−1)+G(1)∗(n−2)+...+G(n−1)∗G(0)
class Solution(object):
def numTrees(self, n):
n = n + 1
dp = [0 for _ in range(n)]
dp[0] = 1
for i in range(1, n): # G(3) = G(0)*G(2) + G(1)*G(1) + G(2)*G(0)
for j in range(i):
dp[i] += dp[j]*dp[i-j-1]
return dp[-1]
if __name__ == '__main__':
s = Solution()
res = s.numTrees(3)
print (res)
152.乘积最大子数组
动态规划解决
由于存在负数,那么会导致最大的变最小的,最小的变最大的。因此还需要维护当前最小值
举例:3, 4, -3 , 2, -1
最大72
No. | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
Max | 3 | 12 | -3 | 2 | 72 |
Min | 3 | 12 | -36 | -72 | -2 |
备注 | 第0位,最大最小都是本身 | 第1位为正数,所以乘起来都为12 | 第2位,由于是负数,所以乘之前的数,都为负数,有最大和最小区分 | 第3位与之前一位相乘,产生一个最大值和最小值 | 第4位,最大最小都是本身 |
F_max(i) = max(F_max(i)*sums[i], F_min(i)*sums[i], nums[i])
F_min(i) = min(F_max(i)*sums[i], F_min(i)*sums[i], nums[i])
# -*- coding:utf-8 -*-
# !/usr/bin/env python
import sys
reload(sys)
sys.setdefaultencoding('utf8')
class Solution(object):
def maxProduct(self, nums):
size = len(nums)
dp_max = [nums[0] for _ in range(size)]
dp_min = [nums[0] for _ in range(size)]
for i in range(1, size):
dp_max[i] = max(dp_max[i-1]*nums[i], dp_min[i-1]*nums[i], nums[i])
dp_min[i] = min(dp_max[i-1]*nums[i], dp_min[i-1]*nums[i], nums[i])
return max(dp_max)
if __name__ == '__main__':
s = Solution()
print(s.maxProduct([3, 4, -3, 2, -1]))
279.完全平方数
d[i] | 0 | 1 | 2 | 3 | 1 | 2 | 3 | 4 | 2 |
---|---|---|---|---|---|---|---|---|---|
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
# -*- coding:utf-8 -*-
# !/usr/bin/env python
import sys
import math
reload(sys)
sys.setdefaultencoding('utf8')
# dp[i] = min(dp[i-1]+1, dp[i-j*j]+1)
class Solution(object):
def numSquares(self, n):
dp = [0 for _ in range(n+1)]
for i in range(1, n+1):
j = int(math.sqrt(i))
dp[i] = min(dp[i-1]+1, dp[i-j*j]+1)
return dp[-1]
if __name__ == '__main__':
s = Solution()
print(s.numSquares(10))