LeetCode题解(1467):两个盒子中球的颜色数相同的概率(Python)

LeetCode题解 专栏收录该内容
1914 篇文章 5 订阅

题目:原题链接(困难)

标签:数学、回溯算法

解法时间复杂度空间复杂度执行用时
Ans 1 (Python)2776ms (17.54%)
Ans 2 (Python)
Ans 3 (Python)

解法一:

from itertools import product
from math import factorial
from math import prod


class Solution:
    def getProbability(self, balls):
        k, n, q = len(balls), sum(balls) // 2, 0

        # 生成每一个球所有可能的分布数
        arrays = [range(0, i + 1) for i in balls]

        # 计算所有球的分布的笛卡尔积(左侧盒子中球的分布)
        t = list(product(*arrays))

        # 遍历所有可能的左侧盒子中球的分布
        for i in range(len(t)):
            if sum(t[i]) == n:  # 判断左侧盒子中的球是否为一半
                if t[i].count(0) == t[-i - 1].count(0):  # t[-i-1]是t[i]的另一个盒子
                    q += self.multinomial(t[i]) * self.multinomial(t[-i - 1])  # 计算当前分布的所有可能数

        return q / self.multinomial(list(balls))

    @staticmethod
    def multinomial(n):
        return factorial(sum(n)) / prod([factorial(i) for i in n])
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值