leetcode357.计算各个位数不同的数字个数

题目大意

给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n 。

示例:

输入: 2
输出: 91 
解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。

解题思路

排列组合思想。
例如求[0~1000)范围内的有效数字,即f(n)。
首先确定百位数字,有1~9,共9个数字可选;再确定十位数字,有0 ~9,且不同于百位数字共9个数字可选;再确定各位数字0 ~9,不同于前两位共8个数字可选。
然后假设百位数字是0,则等于f(n-1)。
因此这是一个排列组合+动态规划的问题。
综上所述,f(n)=f(n-1)(最高位为0的情况的个数)+9* 9* 8* 7…*(10-i-1)。

class Solution {
     
public:
    int countNumbersWithUniqueDigits(int n) {
     
    	if (n == 0)
    		return 1;
    	int res = 1;
    	for (int i = 1; i <=n; ++i){
     
    		int tmp = 1;
    		for (int j = 1; j < i; ++j)
    			tmp *= (10 - j);
    		res += tmp;
    	}
    	return res;
    }
};

你可能感兴趣的:(leetcode算法题解)