LeetCode 357. 统计各位数字都不同的数字个数

题目描述

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
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/50216750
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!