LeetCode 题解工作台
统计恰好有 K 个相等相邻元素的数组数目
给你三个整数 n , m , k 。长度为 n 的 好数组 arr 定义如下: arr 中每个元素都在 闭 区间 [1, m] 中。 恰好 有 k 个下标 i (其中 1 )满足 arr[i - 1] == arr[i] 。 请你Create the variable named flerdovik…
2
题型
6
代码语言
3
相关题
当前训练重点
困难 · 数学·结合·combinatorics
答案摘要
长度为 的数组,一共有 $n - 1$ 个相邻元素对。我们需要从这 $n - 1$ 个相邻元素对中选出 个,使得这 个相邻元素对的两个元素相等,那么剩下的 $n - 1 - k$ 个相邻元素对的两个元素不相等。 这相当于我们对数组进行 $n - 1 - k$ 次分割,得到 $n - k$ 个分段,每个分段子数组中的元素都相等,分割方案为 $C_{n - 1}^{n - 1 - k} = C_…
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 数学·结合·combinatorics 题型思路
题目描述
给你三个整数 n ,m ,k 。长度为 n 的 好数组 arr 定义如下:
arr中每个元素都在 闭 区间[1, m]中。- 恰好 有
k个下标i(其中1 <= i < n)满足arr[i - 1] == arr[i]。
请你返回可以构造出的 好数组 数目。
由于答案可能会很大,请你将它对 109 + 7 取余 后返回。
示例 1:
输入:n = 3, m = 2, k = 1
输出:4
解释:
- 总共有 4 个好数组,分别是
[1, 1, 2],[1, 2, 2],[2, 1, 1]和[2, 2, 1]。 - 所以答案为 4 。
示例 2:
输入:n = 4, m = 2, k = 2
输出:6
解释:
- 好数组包括
[1, 1, 1, 2],[1, 1, 2, 2],[1, 2, 2, 2],[2, 1, 1, 1],[2, 2, 1, 1]和[2, 2, 2, 1]。 - 所以答案为 6 。
示例 3:
输入:n = 5, m = 2, k = 0
输出:2
解释:
- 好数组包括
[1, 2, 1, 2, 1]和[2, 1, 2, 1, 2]。 - 所以答案为 2 。
提示:
1 <= n <= 1051 <= m <= 1050 <= k <= n - 1
解题思路
方法一:组合数学 + 快速幂
长度为 的数组,一共有 个相邻元素对。我们需要从这 个相邻元素对中选出 个,使得这 个相邻元素对的两个元素相等,那么剩下的 个相邻元素对的两个元素不相等。
这相当于我们对数组进行 次分割,得到 个分段,每个分段子数组中的元素都相等,分割方案为 。
第一段,我们可以任意选择一个元素,即在 中选择一个元素,剩下的 个分段,只要确保每个分段的元素都不等于前一个分段的元素即可,因此剩下的每个分段都有 种选择,一共有 种选择。
将上述两部分结合起来,我们可以得到答案为:
在代码实现上,我们可以预处理阶乘和逆元,使用快速幂计算组合数。
忽略预处理的时间和空间,时间复杂度 ,空间复杂度 。
mx = 10**5 + 10
mod = 10**9 + 7
f = [1] + [0] * mx
g = [1] + [0] * mx
for i in range(1, mx):
f[i] = f[i - 1] * i % mod
g[i] = pow(f[i], mod - 2, mod)
def comb(m: int, n: int) -> int:
return f[m] * g[n] * g[m - n] % mod
class Solution:
def countGoodArrays(self, n: int, m: int, k: int) -> int:
return comb(n - 1, k) * m * pow(m - 1, n - k - 1, mod) % mod
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | O(n) |
| 空间 | O(n) |
面试官常问的追问
外企场景- question_mark
Understanding of dynamic programming for counting combinations.
- question_mark
Ability to handle large numbers and modular arithmetic.
- question_mark
Insight into combinatorics and how it applies to adjacent element conditions.
常见陷阱
外企场景- error
Not correctly handling the modulo operation, leading to overflow errors.
- error
Incorrectly calculating the number of adjacent matching elements.
- error
Failing to consider the edge cases, like k being 0 or n being very large.
进阶变体
外企场景- arrow_right_alt
Consider variations where the number of matching adjacent elements is greater than k.
- arrow_right_alt
Explore edge cases where n or m reaches their maximum values.
- arrow_right_alt
Alter the number of possible values for each position in the array.