LeetCode-Python-1359. 有效的快递序列数目(数学)

给你 n 笔订单,每笔订单都需要快递服务。

请你统计所有有效的 收件/配送 序列的数目,确保第 i 个物品的配送服务 delivery(i) 总是在其收件服务 pickup(i) 之后。

由于答案可能很大,请返回答案对 10^9 + 7 取余的结果。

 

示例 1:

输入:n = 1
输出:1
解释:只有一种序列 (P1, D1),物品 1 的配送服务(D1)在物品 1 的收件服务(P1)后。
示例 2:

输入:n = 2
输出:6
解释:所有可能的序列包括:
(P1,P2,D1,D2),(P1,P2,D2,D1),(P1,D1,P2,D2),(P2,P1,D1,D2),(P2,P1,D2,D1) 和 (P2,D2,P1,D1)。
(P1,D2,P2,D1) 是一个无效的序列,因为物品 2 的收件服务(P2)不应在物品 2 的配送服务(D2)之后。
示例 3:

输入:n = 3
输出:90
 

提示:

1 <= n <= 500

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-all-valid-pickup-and-delivery-options
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

数学题。

此题唯一限制条件是必须先 pickup 再delivery。

所以可以通过F(n - 1)的答案推出来F(n)的答案。

推导过程如下:

当 n = 1时,配送顺序唯一, 为 P1, D1。

当 n = 2时,有两种可能的情况,

    1. P2 和 D2 连着做,因此将它们视为一体,试着插入到 n = 1 的答案里。

        此时有效的插入位置有三种,分别为:

                  # p2, d2, p1, d1

                  # p1, p2, d2, d1

                  # p1, d1, p2, d2

       这里的答案数 s = 3  = 2 * (n = 2 - 1) + 1

  2. P2 和 D2 分开, 此时在三个可选空档处任取两个即可组成一个答案,因此答案数为组合数c = C(3, 2)。3还是上面的3。

因此可得 F(n) = F(n - 1) * (s + c)

时间复杂度:O(n)

空间复杂度:O(1)

class Solution(object):
    def countOrders(self, n):
        """
        :type n: int
        :rtype: int
        """
        # f(n - 1) = k
        # f(n) ?
        
        # n = 1, (p1, d1)
        # n = 2, 1. if we pick order2 and deliver order 2 continuously
                  # p2, d2, p1, d1
                  # p1, p2, d2, d1
                  # p1, d1, p2, d2
                 #.1 - 3, 2 - 5, 3 - 7
                
                
                 # t = 2 * (n - 1) + 1
                # 2. if we ******* seperately
                # combination number of (C_{t} ^ {2}))
                
        res = 1
        for i in range(2, n + 1):
            c = 2 * (i - 1) + 1
            s = c * (c - 1) // 2

            res = res * (c + s)
            
        return res % (10 ** 9 + 7)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值