Skip to content

Commit e3bcd3c

Browse files
committed
feat: add solutions to lc problem: No.2338
No.2338.Count the Number of Ideal Arrays
1 parent 4710a05 commit e3bcd3c

File tree

2 files changed

+270
-4
lines changed

2 files changed

+270
-4
lines changed

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

Lines changed: 141 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,20 @@
5959

6060
<!-- 这里可写通用的实现逻辑 -->
6161

62+
我们注意到,$maxValue$ 的最大值不超过 $10^4$,如果数组不含重复元素,那么数组最多只会有不超过 $16$ 个元素。
63+
6264
**方法一:记忆化搜索 + 组合计数**
6365

66+
**方法二:动态规划**
67+
68+
设 $dp[i][j]$ 表示以 $i$ 结尾,且由 $j$ 个不同元素构成的序列的方案数。初始值 $dp[i][1]=1$。
69+
70+
考虑 $n$ 个小球,最终划分为 $j$ 份,那么可以用“隔板法”,即在 $n-1$ 个位置上插入 $j-1$ 个隔板,那么组合数为 $C_{n-1}^{j-1}$ 。
71+
72+
我们可以预处理组合数 $C[i][j]$,根据递推公式 $C[i][j]=C[i-1][j]+C[i-1][j-1]$ 求得,特别地,当 $j=0$ 时,$C[i][j]=1$。
73+
74+
最终的答案为 $\sum\limits_{i=1}^{k}\sum\limits_{j=1}^{\log_2 k + 1}dp[i][j] \times C_{n-1}^{j-1}$ 。其中 $k$ 表示数组的最大值,即 $maxValue$。
75+
6476
<!-- tabs:start -->
6577

6678
### **Python3**
@@ -84,14 +96,37 @@ class Solution:
8496
mod = 10**9 + 7
8597
for i in range(n):
8698
for j in range(min(16, i + 1)):
87-
c[i][j] = 1 if j == 0 else (
88-
c[i - 1][j] + c[i - 1][j - 1]) % mod
99+
c[i][j] = 1 if j == 0 else (c[i - 1][j] + c[i - 1][j - 1]) % mod
89100
ans = 0
90101
for i in range(1, maxValue + 1):
91102
ans = (ans + dfs(i, 1)) % mod
92103
return ans
93104
```
94105

106+
```python
107+
class Solution:
108+
def idealArrays(self, n: int, maxValue: int) -> int:
109+
c = [[0] * 16 for _ in range(n)]
110+
mod = 10**9 + 7
111+
for i in range(n):
112+
for j in range(min(16, i + 1)):
113+
c[i][j] = 1 if j == 0 else (c[i - 1][j] + c[i - 1][j - 1]) % mod
114+
dp = [[0] * 16 for _ in range(maxValue + 1)]
115+
for i in range(1, maxValue + 1):
116+
dp[i][1] = 1
117+
for j in range(1, 15):
118+
for i in range(1, maxValue + 1):
119+
k = 2
120+
while k * i <= maxValue:
121+
dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod
122+
k += 1
123+
ans = 0
124+
for i in range(1, maxValue + 1):
125+
for j in range(1, 16):
126+
ans = (ans + dp[i][j] * c[-1][j - 1]) % mod
127+
return ans
128+
```
129+
95130
### **Java**
96131

97132
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -141,6 +176,40 @@ class Solution {
141176
}
142177
```
143178

179+
```java
180+
class Solution {
181+
private static final int MOD = (int) 1e9 + 7;
182+
183+
public int idealArrays(int n, int maxValue) {
184+
int[][] c = new int[n][16];
185+
for (int i = 0; i < n; ++i) {
186+
for (int j = 0; j <= i && j < 16; ++j) {
187+
c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % MOD;
188+
}
189+
}
190+
long[][] dp = new long[maxValue + 1][16];
191+
for (int i = 1; i <= maxValue; ++i) {
192+
dp[i][1] = 1;
193+
}
194+
for (int j = 1; j < 15; ++j) {
195+
for (int i = 1; i <= maxValue; ++i) {
196+
int k = 2;
197+
for (; k * i <= maxValue; ++k) {
198+
dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % MOD;
199+
}
200+
}
201+
}
202+
long ans = 0;
203+
for (int i = 1; i <= maxValue; ++i) {
204+
for (int j = 1; j < 16; ++j) {
205+
ans = (ans + dp[i][j] * c[n - 1][j - 1]) % MOD;
206+
}
207+
}
208+
return (int) ans;
209+
}
210+
}
211+
```
212+
144213
### **C++**
145214

146215
```cpp
@@ -176,6 +245,37 @@ public:
176245
};
177246
```
178247
248+
```cpp
249+
using ll = long long;
250+
251+
class Solution {
252+
public:
253+
const int mod = 1e9 + 7;
254+
255+
int idealArrays(int n, int maxValue) {
256+
vector<vector<int>> c(n, vector<int>(16));
257+
for (int i = 0; i < n; ++i)
258+
for (int j = 0; j <= i && j < 16; ++j)
259+
c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod;
260+
vector<vector<ll>> dp(maxValue + 1, vector<ll>(16));
261+
for (int i = 1; i <= maxValue; ++i) dp[i][1] = 1;
262+
for (int j = 1; j < 15; ++j)
263+
{
264+
for (int i = 1; i <= maxValue; ++i)
265+
{
266+
int k = 2;
267+
for (; k * i <= maxValue; ++k) dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod;
268+
}
269+
}
270+
ll ans = 0;
271+
for (int i = 1; i <= maxValue; ++i)
272+
for (int j = 1; j < 16; ++j)
273+
ans = (ans + dp[i][j] * c[n - 1][j - 1]) % mod;
274+
return (int) ans;
275+
}
276+
};
277+
```
278+
179279
### **Go**
180280

181281
```go
@@ -224,6 +324,45 @@ func idealArrays(n int, maxValue int) int {
224324
}
225325
```
226326

327+
```go
328+
func idealArrays(n int, maxValue int) int {
329+
mod := int(1e9) + 7
330+
c := make([][]int, n)
331+
for i := range c {
332+
c[i] = make([]int, 16)
333+
}
334+
for i := 0; i < n; i++ {
335+
for 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+
dp := make([][]int, maxValue+1)
344+
for i := range dp {
345+
dp[i] = make([]int, 16)
346+
dp[i][1] = 1
347+
}
348+
for j := 1; j < 15; j++ {
349+
for i := 1; i <= maxValue; i++ {
350+
k := 2
351+
for ; k*i <= maxValue; k++ {
352+
dp[k*i][j+1] = (dp[k*i][j+1] + dp[i][j]) % mod
353+
}
354+
}
355+
}
356+
ans := 0
357+
for i := 1; i <= maxValue; i++ {
358+
for j := 1; j < 16; j++ {
359+
ans = (ans + dp[i][j]*c[n-1][j-1]) % mod
360+
}
361+
}
362+
return ans
363+
}
364+
```
365+
227366
### **TypeScript**
228367

229368
```ts

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

Lines changed: 129 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,37 @@ class Solution:
7676
mod = 10**9 + 7
7777
for i in range(n):
7878
for j in range(min(16, i + 1)):
79-
c[i][j] = 1 if j == 0 else (
80-
c[i - 1][j] + c[i - 1][j - 1]) % mod
79+
c[i][j] = 1 if j == 0 else (c[i - 1][j] + c[i - 1][j - 1]) % mod
8180
ans = 0
8281
for i in range(1, maxValue + 1):
8382
ans = (ans + dfs(i, 1)) % mod
8483
return ans
8584
```
8685

86+
```python
87+
class Solution:
88+
def idealArrays(self, n: int, maxValue: int) -> int:
89+
c = [[0] * 16 for _ in range(n)]
90+
mod = 10**9 + 7
91+
for i in range(n):
92+
for j in range(min(16, i + 1)):
93+
c[i][j] = 1 if j == 0 else (c[i - 1][j] + c[i - 1][j - 1]) % mod
94+
dp = [[0] * 16 for _ in range(maxValue + 1)]
95+
for i in range(1, maxValue + 1):
96+
dp[i][1] = 1
97+
for j in range(1, 15):
98+
for i in range(1, maxValue + 1):
99+
k = 2
100+
while k * i <= maxValue:
101+
dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod
102+
k += 1
103+
ans = 0
104+
for i in range(1, maxValue + 1):
105+
for j in range(1, 16):
106+
ans = (ans + dp[i][j] * c[-1][j - 1]) % mod
107+
return ans
108+
```
109+
87110
### **Java**
88111

89112
```java
@@ -131,6 +154,40 @@ class Solution {
131154
}
132155
```
133156

157+
```java
158+
class Solution {
159+
private static final int MOD = (int) 1e9 + 7;
160+
161+
public int idealArrays(int n, int maxValue) {
162+
int[][] c = new int[n][16];
163+
for (int i = 0; i < n; ++i) {
164+
for (int j = 0; j <= i && j < 16; ++j) {
165+
c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % MOD;
166+
}
167+
}
168+
long[][] dp = new long[maxValue + 1][16];
169+
for (int i = 1; i <= maxValue; ++i) {
170+
dp[i][1] = 1;
171+
}
172+
for (int j = 1; j < 15; ++j) {
173+
for (int i = 1; i <= maxValue; ++i) {
174+
int k = 2;
175+
for (; k * i <= maxValue; ++k) {
176+
dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % MOD;
177+
}
178+
}
179+
}
180+
long ans = 0;
181+
for (int i = 1; i <= maxValue; ++i) {
182+
for (int j = 1; j < 16; ++j) {
183+
ans = (ans + dp[i][j] * c[n - 1][j - 1]) % MOD;
184+
}
185+
}
186+
return (int) ans;
187+
}
188+
}
189+
```
190+
134191
### **C++**
135192

136193
```cpp
@@ -166,6 +223,37 @@ public:
166223
};
167224
```
168225
226+
```cpp
227+
using ll = long long;
228+
229+
class Solution {
230+
public:
231+
const int mod = 1e9 + 7;
232+
233+
int idealArrays(int n, int maxValue) {
234+
vector<vector<int>> c(n, vector<int>(16));
235+
for (int i = 0; i < n; ++i)
236+
for (int j = 0; j <= i && j < 16; ++j)
237+
c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod;
238+
vector<vector<ll>> dp(maxValue + 1, vector<ll>(16));
239+
for (int i = 1; i <= maxValue; ++i) dp[i][1] = 1;
240+
for (int j = 1; j < 15; ++j)
241+
{
242+
for (int i = 1; i <= maxValue; ++i)
243+
{
244+
int k = 2;
245+
for (; k * i <= maxValue; ++k) dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod;
246+
}
247+
}
248+
ll ans = 0;
249+
for (int i = 1; i <= maxValue; ++i)
250+
for (int j = 1; j < 16; ++j)
251+
ans = (ans + dp[i][j] * c[n - 1][j - 1]) % mod;
252+
return (int) ans;
253+
}
254+
};
255+
```
256+
169257
### **Go**
170258

171259
```go
@@ -214,6 +302,45 @@ func idealArrays(n int, maxValue int) int {
214302
}
215303
```
216304

305+
```go
306+
func idealArrays(n int, maxValue int) int {
307+
mod := int(1e9) + 7
308+
c := make([][]int, n)
309+
for i := range c {
310+
c[i] = make([]int, 16)
311+
}
312+
for i := 0; i < n; i++ {
313+
for j := 0; j <= i && j < 16; j++ {
314+
if j == 0 {
315+
c[i][j] = 1
316+
} else {
317+
c[i][j] = (c[i-1][j] + c[i-1][j-1]) % mod
318+
}
319+
}
320+
}
321+
dp := make([][]int, maxValue+1)
322+
for i := range dp {
323+
dp[i] = make([]int, 16)
324+
dp[i][1] = 1
325+
}
326+
for j := 1; j < 15; j++ {
327+
for i := 1; i <= maxValue; i++ {
328+
k := 2
329+
for ; k*i <= maxValue; k++ {
330+
dp[k*i][j+1] = (dp[k*i][j+1] + dp[i][j]) % mod
331+
}
332+
}
333+
}
334+
ans := 0
335+
for i := 1; i <= maxValue; i++ {
336+
for j := 1; j < 16; j++ {
337+
ans = (ans + dp[i][j]*c[n-1][j-1]) % mod
338+
}
339+
}
340+
return ans
341+
}
342+
```
343+
217344
### **TypeScript**
218345

219346
```ts

0 commit comments

Comments
 (0)