Skip to content

Commit e9c6bb5

Browse files
authored
feat: update solution to lc problem: No.2338 (#4365)
1 parent dae8f50 commit e9c6bb5

File tree

11 files changed

+334
-467
lines changed

11 files changed

+334
-467
lines changed

solution/2300-2399/2338.Count the Number of Ideal Arrays/README.md

+102-210
Large diffs are not rendered by default.

solution/2300-2399/2338.Count the Number of Ideal Arrays/README_EN.md

+111-45
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ There are a total of 5 + 2 + 1 + 1 + 1 = 10 distinct ideal arrays.
5353
<strong>Input:</strong> n = 5, maxValue = 3
5454
<strong>Output:</strong> 11
5555
<strong>Explanation:</strong> The following are the possible ideal arrays:
56-
- Arrays starting with the value 1 (9 arrays):
57-
- With no other distinct values (1 array): [1,1,1,1,1]
56+
- Arrays starting with the value 1 (9 arrays):
57+
- With no other distinct values (1 array): [1,1,1,1,1]
5858
- With 2<sup>nd</sup> distinct value 2 (4 arrays): [1,1,1,1,2], [1,1,1,2,2], [1,1,2,2,2], [1,2,2,2,2]
5959
- With 2<sup>nd</sup> distinct value 3 (4 arrays): [1,1,1,1,3], [1,1,1,3,3], [1,1,3,3,3], [1,3,3,3,3]
6060
- Arrays starting with the value 2 (1 array): [2,2,2,2,2]
@@ -76,7 +76,24 @@ There are a total of 9 + 1 + 1 = 11 distinct ideal arrays.
7676

7777
<!-- solution:start -->
7878

79-
### Solution 1
79+
### Solution 1: Dynamic Programming
80+
81+
Let $f[i][j]$ represent the number of sequences ending with $i$ and consisting of $j$ distinct elements. The initial value is $f[i][1] = 1$.
82+
83+
Consider $n$ balls, which are eventually divided into $j$ parts. Using the "separator method," we can insert $j-1$ separators into the $n-1$ positions, and the number of combinations is $c_{n-1}^{j-1}$.
84+
85+
We can preprocess the combination numbers $c[i][j]$ using the recurrence relation $c[i][j] = c[i-1][j] + c[i-1][j-1]$. Specifically, when $j=0$, $c[i][j] = 1$.
86+
87+
The final answer is:
88+
89+
$$
90+
\sum\limits_{i=1}^{k}\sum\limits_{j=1}^{\log_2 k + 1} f[i][j] \times c_{n-1}^{j-1}
91+
$$
92+
93+
where $k$ represents the maximum value of the array, i.e., $\textit{maxValue}$.
94+
95+
- **Time Complexity**: $O(m \times \log^2 m)$
96+
- **Space Complexity**: $O(m \times \log m)$
8097

8198
<!-- tabs:start -->
8299

@@ -255,51 +272,50 @@ class Solution:
255272
for i in range(n):
256273
for j in range(min(16, i + 1)):
257274
c[i][j] = 1 if j == 0 else (c[i - 1][j] + c[i - 1][j - 1]) % mod
258-
dp = [[0] * 16 for _ in range(maxValue + 1)]
275+
f = [[0] * 16 for _ in range(maxValue + 1)]
259276
for i in range(1, maxValue + 1):
260-
dp[i][1] = 1
277+
f[i][1] = 1
261278
for j in range(1, 15):
262279
for i in range(1, maxValue + 1):
263280
k = 2
264281
while k * i <= maxValue:
265-
dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod
282+
f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod
266283
k += 1
267284
ans = 0
268285
for i in range(1, maxValue + 1):
269286
for j in range(1, 16):
270-
ans = (ans + dp[i][j] * c[-1][j - 1]) % mod
287+
ans = (ans + f[i][j] * c[-1][j - 1]) % mod
271288
return ans
272289
```
273290

274291
#### Java
275292

276293
```java
277294
class Solution {
278-
private static final int MOD = (int) 1e9 + 7;
279-
280295
public int idealArrays(int n, int maxValue) {
296+
final int mod = (int) 1e9 + 7;
281297
int[][] c = new int[n][16];
282298
for (int i = 0; i < n; ++i) {
283299
for (int j = 0; j <= i && j < 16; ++j) {
284-
c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % MOD;
300+
c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod;
285301
}
286302
}
287-
long[][] dp = new long[maxValue + 1][16];
303+
long[][] f = new long[maxValue + 1][16];
288304
for (int i = 1; i <= maxValue; ++i) {
289-
dp[i][1] = 1;
305+
f[i][1] = 1;
290306
}
291307
for (int j = 1; j < 15; ++j) {
292308
for (int i = 1; i <= maxValue; ++i) {
293309
int k = 2;
294310
for (; k * i <= maxValue; ++k) {
295-
dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % MOD;
311+
f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod;
296312
}
297313
}
298314
}
299315
long ans = 0;
300316
for (int i = 1; i <= maxValue; ++i) {
301317
for (int j = 1; j < 16; ++j) {
302-
ans = (ans + dp[i][j] * c[n - 1][j - 1]) % MOD;
318+
ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod;
303319
}
304320
}
305321
return (int) ans;
@@ -310,44 +326,54 @@ class Solution {
310326
#### C++
311327

312328
```cpp
313-
using ll = long long;
314-
315329
class Solution {
316330
public:
317-
const int mod = 1e9 + 7;
318-
319331
int idealArrays(int n, int maxValue) {
332+
const int mod = 1e9 + 7;
320333
vector<vector<int>> c(n, vector<int>(16));
321-
for (int i = 0; i < n; ++i)
322-
for (int j = 0; j <= i && j < 16; ++j)
323-
c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod;
324-
vector<vector<ll>> dp(maxValue + 1, vector<ll>(16));
325-
for (int i = 1; i <= maxValue; ++i) dp[i][1] = 1;
334+
for (int i = 0; i < n; ++i) {
335+
for (int j = 0; j <= i && j < 16; ++j) {
336+
if (j == 0) {
337+
c[i][j] = 1;
338+
} else {
339+
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
340+
}
341+
}
342+
}
343+
344+
vector<vector<long long>> f(maxValue + 1, vector<long long>(16));
345+
for (int i = 1; i <= maxValue; ++i) {
346+
f[i][1] = 1;
347+
}
348+
326349
for (int j = 1; j < 15; ++j) {
327350
for (int i = 1; i <= maxValue; ++i) {
328-
int k = 2;
329-
for (; k * i <= maxValue; ++k) dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod;
351+
for (int k = 2; k * i <= maxValue; ++k) {
352+
f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod;
353+
}
330354
}
331355
}
332-
ll ans = 0;
333-
for (int i = 1; i <= maxValue; ++i)
334-
for (int j = 1; j < 16; ++j)
335-
ans = (ans + dp[i][j] * c[n - 1][j - 1]) % mod;
336-
return (int) ans;
356+
357+
long long ans = 0;
358+
for (int i = 1; i <= maxValue; ++i) {
359+
for (int j = 1; j < 16; ++j) {
360+
ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod;
361+
}
362+
}
363+
364+
return ans;
337365
}
338366
};
339367
```
340368

341369
#### Go
342370

343371
```go
344-
func idealArrays(n int, maxValue int) int {
345-
mod := int(1e9) + 7
372+
func idealArrays(n int, maxValue int) (ans int) {
373+
const mod = int(1e9 + 7)
346374
c := make([][]int, n)
347-
for i := range c {
348-
c[i] = make([]int, 16)
349-
}
350375
for i := 0; i < n; i++ {
376+
c[i] = make([]int, 16)
351377
for j := 0; j <= i && j < 16; j++ {
352378
if j == 0 {
353379
c[i][j] = 1
@@ -356,26 +382,66 @@ func idealArrays(n int, maxValue int) int {
356382
}
357383
}
358384
}
359-
dp := make([][]int, maxValue+1)
360-
for i := range dp {
361-
dp[i] = make([]int, 16)
362-
dp[i][1] = 1
385+
386+
f := make([][16]int, maxValue+1)
387+
for i := 1; i <= maxValue; i++ {
388+
f[i][1] = 1
363389
}
364390
for j := 1; j < 15; j++ {
365391
for i := 1; i <= maxValue; i++ {
366-
k := 2
367-
for ; k*i <= maxValue; k++ {
368-
dp[k*i][j+1] = (dp[k*i][j+1] + dp[i][j]) % mod
392+
for k := 2; k*i <= maxValue; k++ {
393+
f[k*i][j+1] = (f[k*i][j+1] + f[i][j]) % mod
369394
}
370395
}
371396
}
372-
ans := 0
397+
373398
for i := 1; i <= maxValue; i++ {
374399
for j := 1; j < 16; j++ {
375-
ans = (ans + dp[i][j]*c[n-1][j-1]) % mod
400+
ans = (ans + f[i][j]*c[n-1][j-1]) % mod
376401
}
377402
}
378-
return ans
403+
return
404+
}
405+
```
406+
407+
#### TypeScript
408+
409+
```ts
410+
function idealArrays(n: number, maxValue: number): number {
411+
const mod = 1e9 + 7;
412+
413+
const c: number[][] = Array.from({ length: n }, () => Array(16).fill(0));
414+
for (let i = 0; i < n; i++) {
415+
for (let j = 0; j <= i && j < 16; j++) {
416+
if (j === 0) {
417+
c[i][j] = 1;
418+
} else {
419+
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
420+
}
421+
}
422+
}
423+
424+
const f: number[][] = Array.from({ length: maxValue + 1 }, () => Array(16).fill(0));
425+
for (let i = 1; i <= maxValue; i++) {
426+
f[i][1] = 1;
427+
}
428+
429+
for (let j = 1; j < 15; j++) {
430+
for (let i = 1; i <= maxValue; i++) {
431+
for (let k = 2; k * i <= maxValue; k++) {
432+
f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod;
433+
}
434+
}
435+
}
436+
437+
let ans = 0;
438+
for (let i = 1; i <= maxValue; i++) {
439+
for (let j = 1; j < 16; j++) {
440+
ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod;
441+
}
442+
}
443+
444+
return ans;
379445
}
380446
```
381447

Original file line numberDiff line numberDiff line change
@@ -1,30 +1,38 @@
11
class Solution {
22
public:
3-
int m, n;
4-
const int mod = 1e9 + 7;
5-
vector<vector<int>> f;
6-
vector<vector<int>> c;
7-
83
int idealArrays(int n, int maxValue) {
9-
this->m = maxValue;
10-
this->n = n;
11-
f.assign(maxValue + 1, vector<int>(16, -1));
12-
c.assign(n, vector<int>(16, 0));
13-
for (int i = 0; i < n; ++i)
14-
for (int j = 0; j <= i && j < 16; ++j)
15-
c[i][j] = !j ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod;
16-
int ans = 0;
17-
for (int i = 1; i <= m; ++i) ans = (ans + dfs(i, 1)) % mod;
18-
return ans;
19-
}
4+
const int mod = 1e9 + 7;
5+
vector<vector<int>> c(n, vector<int>(16));
6+
for (int i = 0; i < n; ++i) {
7+
for (int j = 0; j <= i && j < 16; ++j) {
8+
if (j == 0) {
9+
c[i][j] = 1;
10+
} else {
11+
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
12+
}
13+
}
14+
}
15+
16+
vector<vector<long long>> f(maxValue + 1, vector<long long>(16));
17+
for (int i = 1; i <= maxValue; ++i) {
18+
f[i][1] = 1;
19+
}
2020

21-
int dfs(int i, int cnt) {
22-
if (f[i][cnt] != -1) return f[i][cnt];
23-
int res = c[n - 1][cnt - 1];
24-
if (cnt < n)
25-
for (int k = 2; k * i <= m; ++k)
26-
res = (res + dfs(k * i, cnt + 1)) % mod;
27-
f[i][cnt] = res;
28-
return res;
21+
for (int j = 1; j < 15; ++j) {
22+
for (int i = 1; i <= maxValue; ++i) {
23+
for (int k = 2; k * i <= maxValue; ++k) {
24+
f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod;
25+
}
26+
}
27+
}
28+
29+
long long ans = 0;
30+
for (int i = 1; i <= maxValue; ++i) {
31+
for (int j = 1; j < 16; ++j) {
32+
ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod;
33+
}
34+
}
35+
36+
return ans;
2937
}
30-
};
38+
};
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,8 @@
1-
func idealArrays(n int, maxValue int) int {
2-
mod := int(1e9) + 7
3-
m := maxValue
1+
func idealArrays(n int, maxValue int) (ans int) {
2+
const mod = int(1e9 + 7)
43
c := make([][]int, n)
5-
f := make([][]int, m+1)
6-
for i := range c {
7-
c[i] = make([]int, 16)
8-
}
9-
for i := range f {
10-
f[i] = make([]int, 16)
11-
for j := range f[i] {
12-
f[i][j] = -1
13-
}
14-
}
15-
var dfs func(int, int) int
16-
dfs = func(i, cnt int) int {
17-
if f[i][cnt] != -1 {
18-
return f[i][cnt]
19-
}
20-
res := c[n-1][cnt-1]
21-
if cnt < n {
22-
for k := 2; k*i <= m; k++ {
23-
res = (res + dfs(k*i, cnt+1)) % mod
24-
}
25-
}
26-
f[i][cnt] = res
27-
return res
28-
}
294
for i := 0; i < n; i++ {
5+
c[i] = make([]int, 16)
306
for j := 0; j <= i && j < 16; j++ {
317
if j == 0 {
328
c[i][j] = 1
@@ -35,9 +11,23 @@ func idealArrays(n int, maxValue int) int {
3511
}
3612
}
3713
}
38-
ans := 0
39-
for i := 1; i <= m; i++ {
40-
ans = (ans + dfs(i, 1)) % mod
14+
15+
f := make([][16]int, maxValue+1)
16+
for i := 1; i <= maxValue; i++ {
17+
f[i][1] = 1
18+
}
19+
for j := 1; j < 15; j++ {
20+
for i := 1; i <= maxValue; i++ {
21+
for k := 2; k*i <= maxValue; k++ {
22+
f[k*i][j+1] = (f[k*i][j+1] + f[i][j]) % mod
23+
}
24+
}
25+
}
26+
27+
for i := 1; i <= maxValue; i++ {
28+
for j := 1; j < 16; j++ {
29+
ans = (ans + f[i][j]*c[n-1][j-1]) % mod
30+
}
4131
}
42-
return ans
43-
}
32+
return
33+
}

0 commit comments

Comments
 (0)