LeetCode 357. 统计各位数字都不同的数字个数
题目描述
思路分析
解法一:排列计数(推荐)
核心思路:
- 对于位数为 k 的数字,首位可选 1~9(9 种),其余位依次减少可用数字数量。
- 从 1 位数开始累计到 n 位数,n=0 时答案为 1。
- 计数公式可迭代更新,避免复杂 DP。
复杂度分析:
- 时间复杂度:O(n)。
- 空间复杂度:O(1)。
class Solution {
public int countNumbersWithUniqueDigits(int n) {
if (n == 0) {
return 1;
}
int total = 10;
int unique = 9;
int available = 9;
// 依次计算每一位数的数量
for (int i = 2; i <= n && available > 0; i++) {
unique *= available;
total += unique;
available--;
}
return total;
}
}
func countNumbersWithUniqueDigits(n int) int {
if n == 0 {
return 1
}
total := 10
unique := 9
available := 9
// 依次计算每一位数的数量
for i := 2; i <= n && available > 0; i++ {
unique *= available
total += unique
available--
}
return total
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 46. 全排列 | 中等 | 排列枚举 |
| 47. 全排列 II | 中等 | 去重排列 |
| 77. 组合 | 中等 | 组合计数 |
| 400. 第 N 位数字 | 中等 | 数位规律 |
| 1012. 至少有 1 位重复的数字 | 困难 | 数位 DP |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!