Loading

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;
    }
}
posted @ 2020-10-24 11:34  上海井盖王  阅读(122)  评论(0)    收藏  举报