1359. 有效的快递序列数目
大约 2 分钟
---
1359. 有效的快递序列数目
- 标签:数学、动态规划、组合数学
- 难度:困难
题目链接
题目大意
描述:给定 个订单,每个订单需要先取件()再配送()。取件必须在配送之前。
要求:返回所有可能的有效序列数目,对 取模。
说明:
- 。
示例:
- 示例:
输入: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)。解题思路
思路 1:动态规划 / 组合数学
1. 核心思想
考虑增量构造。已知前 个订单有 种合法序列,现在插入第 个订单( 和 ),且 必须在 之前。
当前已有 个事件在前面。我们需要插入 和 两个事件。
先插入 :有 个位置可以放。
再插入 :必须在 之后,所以有 个位置去掉 所在的 个无效位置,剩下 个位置。
所以:。
其中 是 的可选位置数, 是 的可选位置数... 不对,重新推导。
2. 递推公式推导
已有 个订单,序列长度为 。
插入第 个订单的 和 ,且要求 在 之前。
可选的插入方式数 = ,即在 个位置中选 个位置放 和 ,且顺序固定为 在前。从 个位置选 个的组合数等于 。
所以 。
初始条件 。
3. 结合示例走一遍
:
思路 1:代码
class Solution:
def countOrders(self, n: int) -> int:
mod = 10**9 + 7
ans = 1
for i in range(2, n + 1):
ans = ans * i * (2 * i - 1) % mod
return ans思路 1:复杂度分析
- 时间复杂度:。
- 空间复杂度:。