本文介绍了一种使用 C++ 来解决统计特定位数内所有具有唯一数字组合的整数数量的方法。提供了两种解决方案:一种是通过数学方法进行优化计算;另一种则是采用回溯算法递归地生成所有可能的数字组合并计数。前者时间效率较高,适用于大范围输入,而后者则更直观地展示了问题的求解过程。
c++
class Solution {
public:
intcountNumbersWithUniqueDigits(int n) {
if (n < 0) return0;
if (n == 0) return1;
if (n == 1) return10;
int cum = 10;
int mul = 9;
for (int i = 9; i >= 9 - n + 2; --i) {
mul *= i;
cum += mul;
}
return cum;
}
};
Time Limit Exceeded Solution
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
if (n < 0) return0;
up = pow(10, n);
//cout << 0 << endl;vector<bool> flag(10, false);
backTracking(0,flag);
return validNum;
}
private:
int validNum = 1;//for zeroint up = 0;
void backTracking(int cur, constvector<bool> &flag) {
for (int i = 0; i < 10; ++i) {
if (cur == 0 && i == 0)
continue;
if (isValid(i, flag)) {
if (isBigger(cur * 10 + i)) break;
else validNum++;
vector<bool> tmpflag = flag;
tmpflag[i] = true;
//cout << cur * 10 + i << endl;
backTracking(cur * 10 + i, tmpflag);
}
}
}
inlinebool isValid(int n, constvector<bool> &flag) {
if (flag[n] == true) returnfalse;
returntrue;
}
inlinebool isBigger(int cur) {
if (cur >= up) returntrue;
returnfalse;
}
};