恰有 K 根木棍可以看到的排列数目
难度:
标签:
题目描述
代码结果
运行时间: 207 ms, 内存: 69.5 MB
// Java Stream 不太适合处理此类需要二维数组和动态规划的复杂问题。
// 因此,在这里不使用 Stream API,而是使用普通的二维数组和循环解决问题。
// 代码实现和逻辑与上面普通 Java 版本相同。
解释
方法:
此题解采用了递归+记忆化的方法来解决问题。首先,定义一个递归函数 `getRes(n, k)` 来计算有n根木棍时,恰好有k根木棍可见的排列数。对于基本情况,如果要求的可见木棍数k等于总棍数n,则只有一种排列满足要求。如果k为1,则任何排列中最长的木棍都必须放在最前面,此后的n-1根木棍可以任意排列,因此是(n-1)!种排列。对于一般情况,将问题分为两部分:1) 第n根木棍不增加可见木棍数的情况,此时它必须被前面的某根木棍遮挡,因此这种情况下的排列数为 `getRes(n-1, k) * (n-1)`;2) 第n根木棍增加可见木棍数的情况,即它是可见的,这种情况下的排列数为 `getRes(n-1, k-1)`。最终结果是这两种情况之和,模10^9+7。
时间复杂度:
O(n * k)
空间复杂度:
O(n * k)
代码细节讲解
🦆
递归函数`getRes(n, k)`中,对于`n < k`的情况应该如何处理?题解中未提及这种情况。
▷🦆
在`getRes(n, k)`函数的递归调用中,为什么将`getRes(n-1, k) * (n-1)`视为一种情况?这里的`(n-1)`乘法因子具体代表什么?
▷🦆
题解中提到的记忆化方法具体是如何实现的?能否详细解释`lru_cache`的作用和它如何影响递归函数的性能?
▷🦆
题解中的阶乘函数`factorial(k)`在k为1时直接返回1,但未处理k为0的情况,这是否可能导致问题?
▷