71
71
72
72
时间复杂度 $O(goal \times n)$,空间复杂度 $O(goal \times n)$。其中 $goal$ 和 $n$ 为题目中给定的参数。
73
73
74
+ 注意到 $f[ i] [ j ] $ 只与 $f[ i - 1] [ j - 1 ] $ 和 $f[ i - 1] [ j ] $ 有关,因此我们可以使用滚动数组优化空间复杂度,时间复杂度不变。
75
+
74
76
<!-- tabs:start -->
75
77
76
78
### ** Python3**
@@ -85,13 +87,30 @@ class Solution:
85
87
f[0 ][0 ] = 1
86
88
for i in range (1 , goal + 1 ):
87
89
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:
90
92
f[i][j] += f[i - 1 ][j] * (j - k)
91
93
f[i][j] %= mod
92
94
return f[goal][n]
93
95
```
94
96
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
+
95
114
### ** Java**
96
115
97
116
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -104,8 +123,8 @@ class Solution {
104
123
f[0 ][0 ] = 1 ;
105
124
for (int i = 1 ; i <= goal; ++ i) {
106
125
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) {
109
128
f[i][j] += f[i - 1 ][j] * (j - k);
110
129
}
111
130
f[i][j] %= mod;
@@ -116,6 +135,28 @@ class Solution {
116
135
}
117
136
```
118
137
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
+
119
160
### ** C++**
120
161
121
162
``` cpp
@@ -128,8 +169,8 @@ public:
128
169
f[ 0] [ 0 ] = 1;
129
170
for (int i = 1; i <= goal; ++i) {
130
171
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) {
133
174
f[ i] [ j ] += f[ i - 1] [ j ] * (j - k);
134
175
}
135
176
f[ i] [ j ] %= mod;
@@ -140,6 +181,29 @@ public:
140
181
};
141
182
```
142
183
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
+
143
207
### ** Go**
144
208
145
209
``` go
@@ -152,8 +216,8 @@ func numMusicPlaylists(n int, goal int, k int) int {
152
216
f[0 ][0 ] = 1
153
217
for i := 1 ; i <= goal; i++ {
154
218
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 {
157
221
f[i][j] += f[i-1 ][j] * (j - k)
158
222
}
159
223
f[i][j] %= mod
@@ -163,6 +227,66 @@ func numMusicPlaylists(n int, goal int, k int) int {
163
227
}
164
228
```
165
229
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
+
166
290
### ** ...**
167
291
168
292
```
0 commit comments