题目描述
给你两个整数 n
和 k
。
最初,你有一个长度为 n
的整数数组 a
,对所有 0 <= i <= n - 1
,都有 a[i] = 1
。每过一秒,你会同时更新每个元素为其前面所有元素的和加上该元素本身。例如,一秒后,a[0]
保持不变,a[1]
变为 a[0] + a[1]
,a[2]
变为 a[0] + a[1] + a[2]
,以此类推。
返回 k
秒后 a[n - 1]
的值。
由于答案可能非常大,返回其对 109 + 7
取余 后的结果。
示例 1:
输入:n = 4, k = 5
输出:56
解释:
时间(秒) |
数组状态 |
0 |
[1,1,1,1] |
1 |
[1,2,3,4] |
2 |
[1,3,6,10] |
3 |
[1,4,10,20] |
4 |
[1,5,15,35] |
5 |
[1,6,21,56] |
示例 2:
输入:n = 5, k = 3
输出:35
解释:
时间(秒) |
数组状态 |
0 |
[1,1,1,1,1] |
1 |
[1,2,3,4,5] |
2 |
[1,3,6,10,15] |
3 |
[1,4,10,20,35] |
提示:
解法
方法一:模拟
我们注意到,整数 $n$ 的范围是 $1 \leq n \leq 1000$,因此我们可以直接模拟这个过程。
我们定义一个长度为 $n$ 的数组 $a$,并初始化所有元素为 $1$。然后我们模拟 $k$ 秒的过程,每一秒我们都更新数组 $a$ 的元素,直到 $k$ 秒结束。
最后,我们返回 $a[n - 1]$ 即可。
时间复杂度 $O(n \times k)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $a$ 的长度。
| class Solution:
def valueAfterKSeconds(self, n: int, k: int) -> int:
a = [1] * n
mod = 10**9 + 7
for _ in range(k):
for i in range(1, n):
a[i] = (a[i] + a[i - 1]) % mod
return a[n - 1]
|
1
2
3
4
5
6
7
8
9
10
11
12
13 | class Solution {
public int valueAfterKSeconds(int n, int k) {
final int mod = (int) 1e9 + 7;
int[] a = new int[n];
Arrays.fill(a, 1);
while (k-- > 0) {
for (int i = 1; i < n; ++i) {
a[i] = (a[i] + a[i - 1]) % mod;
}
}
return a[n - 1];
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13 | class Solution {
public:
int valueAfterKSeconds(int n, int k) {
const int mod = 1e9 + 7;
vector<int> a(n, 1);
while (k-- > 0) {
for (int i = 1; i < n; ++i) {
a[i] = (a[i] + a[i - 1]) % mod;
}
}
return a[n - 1];
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13 | func valueAfterKSeconds(n int, k int) int {
const mod int = 1e9 + 7
a := make([]int, n)
for i := range a {
a[i] = 1
}
for ; k > 0; k-- {
for i := 1; i < n; i++ {
a[i] = (a[i] + a[i-1]) % mod
}
}
return a[n-1]
}
|
| function valueAfterKSeconds(n: number, k: number): number {
const a: number[] = Array(n).fill(1);
const mod: number = 10 ** 9 + 7;
while (k--) {
for (let i = 1; i < n; ++i) {
a[i] = (a[i] + a[i - 1]) % mod;
}
}
return a[n - 1];
}
|