357. [动态规划]计算各个位数不同的数字个数
357. 计算各个位数不同的数字个数
方法一:动态规划
根据规律,只关心数量,不用遍历到每个有效数字。
// 执行耗时:0 ms,击败了100.00% 的Java用户
// 内存消耗:35.1 MB,击败了92.88% 的Java用户
class Solution {
/**
* 排列组合:n位有效数字 = 每一位都从 0~9 中选择,且不能以 0 开头
* 1位数字:0~9 10
* 2位数字:C10-2,且第一位不能是0 9 * 9
* 3位数字:C10-3,且第一位不能是0 9 * 9 * 8
* 4位数字:C10-4,且第一位不能是0 9 * 9 * 8 * 7
* ... ...
* 最后,总数 = 所有 小于 n 的位数个数相加
*/
public int countNumbersWithUniqueDigits(int n) {
if (n == 0){
return 1;
}
int ans = 10, second = 9 * 9;
int len = Math.min(n, 10);
for (int i = 2; i <= len; i++) {
ans += second;
second *= 10 - i;
}
return ans;
}
}

浙公网安备 33010602011771号