Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 926cf29

Browse files
🐱(backtrack): 357. 计算各个位数不同的数字个数
1 parent 8e51cf5 commit 926cf29

File tree

1 file changed

+75
-1
lines changed

1 file changed

+75
-1
lines changed

‎docs/algorithm/backtrack/README.md‎

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,78 @@ func dfs(ans *[][]int, element []int, start int, num int, k int) {
168168
}
169169
```
170170

171-
<!-- tabs:end -->
171+
<!-- tabs:end -->
172+
173+
## 357. 计算各个位数不同的数字个数
174+
175+
[原题链接](https://leetcode-cn.com/problems/count-numbers-with-unique-digits/)
176+
177+
### 解法一:回溯
178+
179+
`tags` 数组标记 0~9 数字出现的次数,再调用递归后进行回溯。注意对 0 进行特殊处理。
180+
181+
```python
182+
class Solution:
183+
ans = 0
184+
tags = [] # 记录数字出现的次数
185+
def countNumbersWithUniqueDigits(self, n: int) -> int:
186+
# 0-9 的数字
187+
self.tags = [0 for _ in range(10)]
188+
# 枚举所有数字:回溯
189+
"""
190+
r: 轮次
191+
num: 数字
192+
"""
193+
def dfs(r, num = 0):
194+
if r <= 0:
195+
# 结束递归
196+
return
197+
198+
for i in range(10):
199+
# 循环 0-9
200+
if num % 10 != i and self.tags[i] == 0:
201+
# 条件枝剪
202+
self.ans += 1
203+
# 数字出现标记
204+
self.tags[i] = 1
205+
dfs(r - 1, num * 10 + i)
206+
# 回溯
207+
self.tags[i] = 0
208+
209+
dfs(n)
210+
# 补充 0
211+
return self.ans + 1
212+
```
213+
214+
### 解法二:动态规划
215+
216+
排列组合。
217+
218+
- `f(0) = 1`
219+
- `f(1) = 9`
220+
- `f(2) = 9 * 9 + f(1)`
221+
- 第一个数字选择 1~9
222+
- 第二个数在 0~9 中选择和第一个数不同的数
223+
- `f(3) = 9 * 9 * 8 + f(2)`
224+
225+
可以推出动态规划方程:
226+
227+
```
228+
dp[i] = sum + dp[i - 1]
229+
```
230+
231+
```python
232+
class Solution:
233+
def countNumbersWithUniqueDigits(self, n: int) -> int:
234+
dp = [0 for _ in range(n + 1)]
235+
# n = 1 时
236+
dp[0] = 1
237+
238+
for i in range(1, n + 1):
239+
s = 9
240+
for j in range(1, i):
241+
s *= (10 - j)
242+
dp[i] = s + dp[i - 1]
243+
244+
return dp[n]
245+
```

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /