@@ -105,6 +105,36 @@ class Solution:
105
105
return ans
106
106
```
107
107
108
+ ``` python
109
+ class Solution :
110
+ def numDupDigitsAtMostN (self , n : int ) -> int :
111
+ return n - self .f(n)
112
+
113
+ def f (self , n ):
114
+ @cache
115
+ def dfs (pos , mask , lead , limit ):
116
+ if pos <= 0 :
117
+ return lead ^ 1
118
+ up = a[pos] if limit else 9
119
+ ans = 0
120
+ for i in range (up + 1 ):
121
+ if (mask >> i) & 1 :
122
+ continue
123
+ if i == 0 and lead:
124
+ ans += dfs(pos - 1 , mask, lead, limit and i == up)
125
+ else :
126
+ ans += dfs(pos - 1 , mask | 1 << i, False , limit and i == up)
127
+ return ans
128
+
129
+ a = [0 ] * 11
130
+ l = 0
131
+ while n:
132
+ l += 1
133
+ a[l] = n % 10
134
+ n //= 10
135
+ return dfs(l, 0 , True , True )
136
+ ```
137
+
108
138
### ** Java**
109
139
110
140
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -152,6 +182,54 @@ class Solution {
152
182
}
153
183
```
154
184
185
+ ``` java
186
+ class Solution {
187
+ private int [] a = new int [11 ];
188
+ private int [][] dp = new int [11 ][1 << 11 ];
189
+
190
+ public int numDupDigitsAtMostN (int n ) {
191
+ return n - f(n);
192
+ }
193
+
194
+ private int f (int n ) {
195
+ for (var e : dp) {
196
+ Arrays . fill(e, - 1 );
197
+ }
198
+ int len = 0 ;
199
+ while (n > 0 ) {
200
+ a[++ len] = n % 10 ;
201
+ n /= 10 ;
202
+ }
203
+ return dfs(len, 0 , true , true );
204
+ }
205
+
206
+ private int dfs (int pos , int mask , boolean lead , boolean limit ) {
207
+ if (pos <= 0 ) {
208
+ return lead ? 0 : 1 ;
209
+ }
210
+ if (! lead && ! limit && dp[pos][mask] != - 1 ) {
211
+ return dp[pos][mask];
212
+ }
213
+ int up = limit ? a[pos] : 9 ;
214
+ int ans = 0 ;
215
+ for (int i = 0 ; i <= up; ++ i) {
216
+ if (((mask >> i) & 1 ) == 1 ) {
217
+ continue ;
218
+ }
219
+ if (i == 0 && lead) {
220
+ ans += dfs(pos - 1 , mask, lead, limit && i == up);
221
+ } else {
222
+ ans += dfs(pos - 1 , mask | 1 << i, false , limit && i == up);
223
+ }
224
+ }
225
+ if (! lead && ! limit) {
226
+ dp[pos][mask] = ans;
227
+ }
228
+ return ans;
229
+ }
230
+ }
231
+ ```
232
+
155
233
### ** C++**
156
234
157
235
``` cpp
@@ -197,6 +275,51 @@ public:
197
275
};
198
276
```
199
277
278
+ ```cpp
279
+ class Solution {
280
+ public:
281
+ int a[11];
282
+ int dp[11][1 << 11];
283
+
284
+ int numDupDigitsAtMostN(int n) {
285
+ return n - f(n);
286
+ }
287
+
288
+ int f(int n) {
289
+ memset(dp, -1, sizeof dp);
290
+ int len = 0;
291
+ while (n) {
292
+ a[++len] = n % 10;
293
+ n /= 10;
294
+ }
295
+ return dfs(len, 0, true, true);
296
+ }
297
+
298
+ int dfs(int pos, int mask, bool lead, bool limit) {
299
+ if (pos <= 0) {
300
+ return lead ? 0 : 1;
301
+ }
302
+ if (!lead && !limit && dp[pos][mask] != -1) {
303
+ return dp[pos][mask];
304
+ }
305
+ int up = limit ? a[pos] : 9;
306
+ int ans = 0;
307
+ for (int i = 0; i <= up; ++i) {
308
+ if ((mask >> i) & 1) continue;
309
+ if (i == 0 && lead) {
310
+ ans += dfs(pos - 1, mask, lead, limit && i == up);
311
+ } else {
312
+ ans += dfs(pos - 1, mask | 1 << i, false, limit && i == up);
313
+ }
314
+ }
315
+ if (!lead && !limit) {
316
+ dp[pos][mask] = ans;
317
+ }
318
+ return ans;
319
+ }
320
+ };
321
+ ```
322
+
200
323
### ** Go**
201
324
202
325
``` go
@@ -246,6 +369,62 @@ func A(m, n int) int {
246
369
}
247
370
```
248
371
372
+ ``` go
373
+ func numDupDigitsAtMostN (n int ) int {
374
+ return n - f (n)
375
+ }
376
+
377
+ func f (n int ) int {
378
+ a := make ([]int , 11 )
379
+ dp := make ([][]int , 11 )
380
+ for i := range dp {
381
+ dp[i] = make ([]int , 1 <<11 )
382
+ for j := range dp[i] {
383
+ dp[i][j] = -1
384
+ }
385
+ }
386
+ l := 0
387
+ for n > 0 {
388
+ l++
389
+ a[l] = n % 10
390
+ n /= 10
391
+ }
392
+ var dfs func (int , int , bool , bool ) int
393
+ dfs = func (pos, mask int , lead, limit bool ) int {
394
+ if pos <= 0 {
395
+ if lead {
396
+ return 0
397
+ }
398
+ return 1
399
+ }
400
+ if !lead && !limit && dp[pos][mask] != -1 {
401
+ return dp[pos][mask]
402
+ }
403
+ ans := 0
404
+ up := 9
405
+ if limit {
406
+ up = a[pos]
407
+ }
408
+ for i := 0 ; i <= up; i++ {
409
+ if ((mask >> i) & 1 ) == 1 {
410
+ continue
411
+ }
412
+ if i == 0 && lead {
413
+ ans += dfs (pos-1 , mask, lead, limit && i == up)
414
+ } else {
415
+ ans += dfs (pos-1 , mask|1 <<i, false , limit && i == up)
416
+ }
417
+ }
418
+ if !lead && !limit {
419
+ dp[pos][mask] = ans
420
+ }
421
+ return ans
422
+ }
423
+
424
+ return dfs (l, 0 , true , true )
425
+ }
426
+ ```
427
+
249
428
### ** ...**
250
429
251
430
```
0 commit comments