【快手一面】令面试者感触颇多的三个算法题目

216 阅读2分钟

96.不同的二叉搜索树

动态规划思想解决:

重点: 假设n个节点存在二叉排序树的个数是G(n),令f(i)为以i为根的二叉搜索树的个数

则: G(n)=f(1)+f(2)+f(3)+f(4)+...+f(n)G(n)=f(1)+f(2)+f(3)+f(4)+...+f(n),这也是利用动态规划思想的核心

  • ii 为根节点时,其左子树节点个数为 i1i-1 个,右子树节点为 nin-i,则

    f(i)=G(i1)G(ni)f(i)=G(i−1)∗G(n−i)

  • 综合两个公式可以得到 卡特兰数 公式

    G(n)=G(0)G(n1)+G(1)(n2)+...+G(n1)G(0)G(n)=G(0)∗G(n−1)+G(1)∗(n−2)+...+G(n−1)∗G(0)

123
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.01234
Max312-3272
Min312-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.完全平方数

dp[i]=min(dp[i1]+1,dp[ijj]+1)dp[i] = min(dp[i-1]+1, dp[i-j*j]+1)

d[i]012312342
i012345678
# -*- 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))