Skip to content

Commit 0f27730

Browse files
committed
feat: add solutions to lc problem: No.0920
No.0920.Number of Music Playlists
1 parent c26d00c commit 0f27730

File tree

7 files changed

+306
-24
lines changed

7 files changed

+306
-24
lines changed

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

+132-8
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ $$
7171

7272
时间复杂度 $O(goal \times n)$,空间复杂度 $O(goal \times n)$。其中 $goal$ 和 $n$ 为题目中给定的参数。
7373

74+
注意到 $f[i][j]$ 只与 $f[i - 1][j - 1]$ 和 $f[i - 1][j]$ 有关,因此我们可以使用滚动数组优化空间复杂度,时间复杂度不变。
75+
7476
<!-- tabs:start -->
7577

7678
### **Python3**
@@ -85,13 +87,30 @@ class Solution:
8587
f[0][0] = 1
8688
for i in range(1, goal + 1):
8789
for j in range(1, n + 1):
88-
f[i][j] += f[i - 1][j - 1] * (n - j + 1)
89-
if j >= k:
90+
f[i][j] = f[i - 1][j - 1] * (n - j + 1)
91+
if j > k:
9092
f[i][j] += f[i - 1][j] * (j - k)
9193
f[i][j] %= mod
9294
return f[goal][n]
9395
```
9496

97+
```python
98+
class Solution:
99+
def numMusicPlaylists(self, n: int, goal: int, k: int) -> int:
100+
mod = 10**9 + 7
101+
f = [0] * (goal + 1)
102+
f[0] = 1
103+
for i in range(1, goal + 1):
104+
g = [0] * (goal + 1)
105+
for j in range(1, n + 1):
106+
g[j] = f[j - 1] * (n - j + 1)
107+
if j > k:
108+
g[j] += f[j] * (j - k)
109+
g[j] %= mod
110+
f = g
111+
return f[n]
112+
```
113+
95114
### **Java**
96115

97116
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -104,8 +123,8 @@ class Solution {
104123
f[0][0] = 1;
105124
for (int i = 1; i <= goal; ++i) {
106125
for (int j = 1; j <= n; ++j) {
107-
f[i][j] += f[i - 1][j - 1] * (n - j + 1);
108-
if (j >= k) {
126+
f[i][j] = f[i - 1][j - 1] * (n - j + 1);
127+
if (j > k) {
109128
f[i][j] += f[i - 1][j] * (j - k);
110129
}
111130
f[i][j] %= mod;
@@ -116,6 +135,28 @@ class Solution {
116135
}
117136
```
118137

138+
```java
139+
class Solution {
140+
public int numMusicPlaylists(int n, int goal, int k) {
141+
final int mod = (int) 1e9 + 7;
142+
long[] f = new long[n + 1];
143+
f[0] = 1;
144+
for (int i = 1; i <= goal; ++i) {
145+
long[] g = new long[n + 1];
146+
for (int j = 1; j <= n; ++j) {
147+
g[j] = f[j - 1] * (n - j + 1);
148+
if (j > k) {
149+
g[j] += f[j] * (j - k);
150+
}
151+
g[j] %= mod;
152+
}
153+
f = g;
154+
}
155+
return (int) f[n];
156+
}
157+
}
158+
```
159+
119160
### **C++**
120161

121162
```cpp
@@ -128,8 +169,8 @@ public:
128169
f[0][0] = 1;
129170
for (int i = 1; i <= goal; ++i) {
130171
for (int j = 1; j <= n; ++j) {
131-
f[i][j] += f[i - 1][j - 1] * (n - j + 1);
132-
if (j >= k) {
172+
f[i][j] = f[i - 1][j - 1] * (n - j + 1);
173+
if (j > k) {
133174
f[i][j] += f[i - 1][j] * (j - k);
134175
}
135176
f[i][j] %= mod;
@@ -140,6 +181,29 @@ public:
140181
};
141182
```
142183
184+
```cpp
185+
class Solution {
186+
public:
187+
int numMusicPlaylists(int n, int goal, int k) {
188+
const int mod = 1e9 + 7;
189+
vector<long long> f(n + 1);
190+
f[0] = 1;
191+
for (int i = 1; i <= goal; ++i) {
192+
vector<long long> g(n + 1);
193+
for (int j = 1; j <= n; ++j) {
194+
g[j] = f[j - 1] * (n - j + 1);
195+
if (j > k) {
196+
g[j] += f[j] * (j - k);
197+
}
198+
g[j] %= mod;
199+
}
200+
f = move(g);
201+
}
202+
return f[n];
203+
}
204+
};
205+
```
206+
143207
### **Go**
144208

145209
```go
@@ -152,8 +216,8 @@ func numMusicPlaylists(n int, goal int, k int) int {
152216
f[0][0] = 1
153217
for i := 1; i <= goal; i++ {
154218
for j := 1; j <= n; j++ {
155-
f[i][j] += f[i-1][j-1] * (n - j + 1)
156-
if j >= k {
219+
f[i][j] = f[i-1][j-1] * (n - j + 1)
220+
if j > k {
157221
f[i][j] += f[i-1][j] * (j - k)
158222
}
159223
f[i][j] %= mod
@@ -163,6 +227,66 @@ func numMusicPlaylists(n int, goal int, k int) int {
163227
}
164228
```
165229

230+
```go
231+
func numMusicPlaylists(n int, goal int, k int) int {
232+
const mod = 1e9 + 7
233+
f := make([]int, goal+1)
234+
f[0] = 1
235+
for i := 1; i <= goal; i++ {
236+
g := make([]int, goal+1)
237+
for j := 1; j <= n; j++ {
238+
g[j] = f[j-1] * (n - j + 1)
239+
if j > k {
240+
g[j] += f[j] * (j - k)
241+
}
242+
g[j] %= mod
243+
}
244+
f = g
245+
}
246+
return f[n]
247+
}
248+
```
249+
250+
### **TypeScript**
251+
252+
```ts
253+
function numMusicPlaylists(n: number, goal: number, k: number): number {
254+
const mod = 1e9 + 7;
255+
const f = new Array(goal + 1).fill(0).map(() => new Array(n + 1).fill(0));
256+
f[0][0] = 1;
257+
for (let i = 1; i <= goal; ++i) {
258+
for (let j = 1; j <= n; ++j) {
259+
f[i][j] = f[i - 1][j - 1] * (n - j + 1);
260+
if (j > k) {
261+
f[i][j] += f[i - 1][j] * (j - k);
262+
}
263+
f[i][j] %= mod;
264+
}
265+
}
266+
return f[goal][n];
267+
}
268+
```
269+
270+
```ts
271+
function numMusicPlaylists(n: number, goal: number, k: number): number {
272+
const mod = 1e9 + 7;
273+
let f = new Array(goal + 1).fill(0);
274+
f[0] = 1;
275+
for (let i = 1; i <= goal; ++i) {
276+
const g = new Array(goal + 1).fill(0);
277+
for (let j = 1; j <= n; ++j) {
278+
g[j] = f[j - 1] * (n - j + 1);
279+
if (j > k) {
280+
g[j] += f[j] * (j - k);
281+
}
282+
g[j] %= mod;
283+
}
284+
f = g;
285+
}
286+
return f[n];
287+
}
288+
```
289+
166290
### **...**
167291

168292
```

0 commit comments

Comments
 (0)