Skip to content

Commit 1375737

Browse files
committed
feat: add solutions to lc problem: No.0920
No.0920.Number of Music Playlists
1 parent 658ae5f commit 1375737

File tree

6 files changed

+235
-2
lines changed

6 files changed

+235
-2
lines changed

solution/0900-0999/0920.Number of Music Playlists/README.md

+94-1
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,115 @@
5050

5151
<!-- 这里可写通用的实现逻辑 -->
5252

53+
**方法一:动态规划**
54+
55+
我们定义 $f[i][j]$ 表示听 $i$ 首歌,且这 $i$ 首歌中有 $j$ 首不同歌曲的播放列表的数量。初始时 $f[0][0]=1$。答案为 $f[goal][n]$。
56+
57+
对于 $f[i][j]$,我们可以选择没听过的歌,那么上一个状态为 $f[i - 1][j - 1]$,这样的选择有 $n - (j - 1) = n - j + 1$ 种,因此 $f[i][j] += f[i - 1][j - 1] \times (n - j + 1)$。我们也可以选择听过的歌,那么上一个状态为 $f[i - 1][j]$,这样的选择有 $j - k$ 种,因此 $f[i][j] += f[i - 1][j] \times (j - k)$,其中 $j \geq k$。
58+
59+
综上,我们可以得到状态转移方程:
60+
61+
$$
62+
f[i][j] = \begin{cases}
63+
1 & i = 0, j = 0 \\
64+
f[i - 1][j - 1] \times (n - j + 1) + f[i - 1][j] \times (j - k) & i \geq 1, j \geq 1
65+
\end{cases}
66+
$$
67+
68+
最终的答案为 $f[goal][n]$。
69+
70+
时间复杂度 $O(goal \times n)$,空间复杂度 $O(goal \times n)$。其中 $goal$ 和 $n$ 为题目中给定的参数。
71+
5372
<!-- tabs:start -->
5473

5574
### **Python3**
5675

5776
<!-- 这里可写当前语言的特殊实现逻辑 -->
5877

5978
```python
60-
79+
class Solution:
80+
def numMusicPlaylists(self, n: int, goal: int, k: int) -> int:
81+
mod = 10**9 + 7
82+
f = [[0] * (n + 1) for _ in range(goal + 1)]
83+
f[0][0] = 1
84+
for i in range(1, goal + 1):
85+
for j in range(1, n + 1):
86+
f[i][j] += f[i - 1][j - 1] * (n - j + 1)
87+
if j >= k:
88+
f[i][j] += f[i - 1][j] * (j - k)
89+
f[i][j] %= mod
90+
return f[goal][n]
6191
```
6292

6393
### **Java**
6494

6595
<!-- 这里可写当前语言的特殊实现逻辑 -->
6696

6797
```java
98+
class Solution {
99+
public int numMusicPlaylists(int n, int goal, int k) {
100+
final int mod = (int) 1e9 + 7;
101+
long[][] f = new long[goal + 1][n + 1];
102+
f[0][0] = 1;
103+
for (int i = 1; i <= goal; ++i) {
104+
for (int j = 1; j <= n; ++j) {
105+
f[i][j] += f[i - 1][j - 1] * (n - j + 1);
106+
if (j >= k) {
107+
f[i][j] += f[i - 1][j] * (j - k);
108+
}
109+
f[i][j] %= mod;
110+
}
111+
}
112+
return (int) f[goal][n];
113+
}
114+
}
115+
```
116+
117+
### **C++**
118+
119+
```cpp
120+
class Solution {
121+
public:
122+
int numMusicPlaylists(int n, int goal, int k) {
123+
const int mod = 1e9 + 7;
124+
long long f[goal + 1][n + 1];
125+
memset(f, 0, sizeof(f));
126+
f[0][0] = 1;
127+
for (int i = 1; i <= goal; ++i) {
128+
for (int j = 1; j <= n; ++j) {
129+
f[i][j] += f[i - 1][j - 1] * (n - j + 1);
130+
if (j >= k) {
131+
f[i][j] += f[i - 1][j] * (j - k);
132+
}
133+
f[i][j] %= mod;
134+
}
135+
}
136+
return f[goal][n];
137+
}
138+
};
139+
```
68140
141+
### **Go**
142+
143+
```go
144+
func numMusicPlaylists(n int, goal int, k int) int {
145+
const mod = 1e9 + 7
146+
f := make([][]int, goal+1)
147+
for i := range f {
148+
f[i] = make([]int, n+1)
149+
}
150+
f[0][0] = 1
151+
for i := 1; i <= goal; i++ {
152+
for j := 1; j <= n; j++ {
153+
f[i][j] += f[i-1][j-1] * (n - j + 1)
154+
if j >= k {
155+
f[i][j] += f[i-1][j] * (j - k)
156+
}
157+
f[i][j] %= mod
158+
}
159+
}
160+
return f[goal][n]
161+
}
69162
```
70163

71164
### **...**

solution/0900-0999/0920.Number of Music Playlists/README_EN.md

+75-1
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,87 @@
5151
### **Python3**
5252

5353
```python
54-
54+
class Solution:
55+
def numMusicPlaylists(self, n: int, goal: int, k: int) -> int:
56+
mod = 10**9 + 7
57+
f = [[0] * (n + 1) for _ in range(goal + 1)]
58+
f[0][0] = 1
59+
for i in range(1, goal + 1):
60+
for j in range(1, n + 1):
61+
f[i][j] += f[i - 1][j - 1] * (n - j + 1)
62+
if j >= k:
63+
f[i][j] += f[i - 1][j] * (j - k)
64+
f[i][j] %= mod
65+
return f[goal][n]
5566
```
5667

5768
### **Java**
5869

5970
```java
71+
class Solution {
72+
public int numMusicPlaylists(int n, int goal, int k) {
73+
final int mod = (int) 1e9 + 7;
74+
long[][] f = new long[goal + 1][n + 1];
75+
f[0][0] = 1;
76+
for (int i = 1; i <= goal; ++i) {
77+
for (int j = 1; j <= n; ++j) {
78+
f[i][j] += f[i - 1][j - 1] * (n - j + 1);
79+
if (j >= k) {
80+
f[i][j] += f[i - 1][j] * (j - k);
81+
}
82+
f[i][j] %= mod;
83+
}
84+
}
85+
return (int) f[goal][n];
86+
}
87+
}
88+
```
89+
90+
### **C++**
91+
92+
```cpp
93+
class Solution {
94+
public:
95+
int numMusicPlaylists(int n, int goal, int k) {
96+
const int mod = 1e9 + 7;
97+
long long f[goal + 1][n + 1];
98+
memset(f, 0, sizeof(f));
99+
f[0][0] = 1;
100+
for (int i = 1; i <= goal; ++i) {
101+
for (int j = 1; j <= n; ++j) {
102+
f[i][j] += f[i - 1][j - 1] * (n - j + 1);
103+
if (j >= k) {
104+
f[i][j] += f[i - 1][j] * (j - k);
105+
}
106+
f[i][j] %= mod;
107+
}
108+
}
109+
return f[goal][n];
110+
}
111+
};
112+
```
60113
114+
### **Go**
115+
116+
```go
117+
func numMusicPlaylists(n int, goal int, k int) int {
118+
const mod = 1e9 + 7
119+
f := make([][]int, goal+1)
120+
for i := range f {
121+
f[i] = make([]int, n+1)
122+
}
123+
f[0][0] = 1
124+
for i := 1; i <= goal; i++ {
125+
for j := 1; j <= n; j++ {
126+
f[i][j] += f[i-1][j-1] * (n - j + 1)
127+
if j >= k {
128+
f[i][j] += f[i-1][j] * (j - k)
129+
}
130+
f[i][j] %= mod
131+
}
132+
}
133+
return f[goal][n]
134+
}
61135
```
62136

63137
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public:
3+
int numMusicPlaylists(int n, int goal, int k) {
4+
const int mod = 1e9 + 7;
5+
long long f[goal + 1][n + 1];
6+
memset(f, 0, sizeof(f));
7+
f[0][0] = 1;
8+
for (int i = 1; i <= goal; ++i) {
9+
for (int j = 1; j <= n; ++j) {
10+
f[i][j] += f[i - 1][j - 1] * (n - j + 1);
11+
if (j >= k) {
12+
f[i][j] += f[i - 1][j] * (j - k);
13+
}
14+
f[i][j] %= mod;
15+
}
16+
}
17+
return f[goal][n];
18+
}
19+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
func numMusicPlaylists(n int, goal int, k int) int {
2+
const mod = 1e9 + 7
3+
f := make([][]int, goal+1)
4+
for i := range f {
5+
f[i] = make([]int, n+1)
6+
}
7+
f[0][0] = 1
8+
for i := 1; i <= goal; i++ {
9+
for j := 1; j <= n; j++ {
10+
f[i][j] += f[i-1][j-1] * (n - j + 1)
11+
if j >= k {
12+
f[i][j] += f[i-1][j] * (j - k)
13+
}
14+
f[i][j] %= mod
15+
}
16+
}
17+
return f[goal][n]
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public int numMusicPlaylists(int n, int goal, int k) {
3+
final int mod = (int) 1e9 + 7;
4+
long[][] f = new long[goal + 1][n + 1];
5+
f[0][0] = 1;
6+
for (int i = 1; i <= goal; ++i) {
7+
for (int j = 1; j <= n; ++j) {
8+
f[i][j] += f[i - 1][j - 1] * (n - j + 1);
9+
if (j >= k) {
10+
f[i][j] += f[i - 1][j] * (j - k);
11+
}
12+
f[i][j] %= mod;
13+
}
14+
}
15+
return (int) f[goal][n];
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def numMusicPlaylists(self, n: int, goal: int, k: int) -> int:
3+
mod = 10**9 + 7
4+
f = [[0] * (n + 1) for _ in range(goal + 1)]
5+
f[0][0] = 1
6+
for i in range(1, goal + 1):
7+
for j in range(1, n + 1):
8+
f[i][j] += f[i - 1][j - 1] * (n - j + 1)
9+
if j >= k:
10+
f[i][j] += f[i - 1][j] * (j - k)
11+
f[i][j] %= mod
12+
return f[goal][n]

0 commit comments

Comments
 (0)