题源
知识点
- 数学 -
排列组合
思路
- 刚开始拿到这一题,我差点想去枚举,然后累加个数,后面想想算了,肯定没有那么拉跨。
- 后面发现就是一道简单的排列组合:
- 求n位且各个位数的数字互不相同的个数:
最高位不能为0,即只有9种
,次高位排除最高位然后可以为0,则为9种
,下一层则为8种
…
- 求n位且各个位数的数字互不相同的个数:
- 这道题目,则就是一个简单的递归:
f(0) = 1
f(1) = 9 + f(0)
// 意思就是先算一位的个数,再加上前一位的总个数f(2) = 9 * 9 + f(1)
// 意思就是先算二位的个数,再加上前一位的总个数f(3) = 9 * 9 * 8 + f(2)
// 意思就是先算三位的个数,再加上前一位的总个数- …
- 这样就可以简单写出一个
递归
函数了。
代码
python
class Solution:
def countNumbersWithUniqueDigits(self, n: int) -> int:
if n == 0:
return 1 # 出口
sumN = 9 # n位数字符合条件的个数
for _ in range(11 - n, 10):
sumN *= _
return sumN + self.countNumbersWithUniqueDigits(n - 1)
执行用时:32 ms, 在所有 Python3 提交中击败90.03%的用户
内存消耗:14.9 MB, 在所有 Python3 提交中击败了71.43%的用户
javascript
/**
* @param {number} n
* @return {number}
*/
var countNumbersWithUniqueDigits = function(n) {
if(n == 0) return 1; // 出口
let sum = 9;
for(let i = 9; i > 10 - n; i--) sum *= i;
return sum + countNumbersWithUniqueDigits(n - 1);
};
执行用时:48 ms, 在所有 JavaScript 提交中击败了99.01%的用户
内存消耗:40.9 MB, 在所有 JavaScript 提交中击败了46.53%的用户
java
class Solution {
public int countNumbersWithUniqueDigits(int n) {
if(n == 0) return 1; // 出口
int sum = 9;
for(int i = 9; i > 10 - n; i--) sum *= i;
return sum + this.countNumbersWithUniqueDigits(n - 1);
}
}
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.1 MB, 在所有 Java 提交中击败了51.14%的用户
C
int countNumbersWithUniqueDigits(int n){
if(n == 0) return 1; // 出口
int sum = 9;
for(int i = 9; i > 10 - n; i--) sum *= i;
return sum + countNumbersWithUniqueDigits(n - 1);
}
执行用时:0 ms, 在所有 C 提交中击败了100.00%的用户
内存消耗:5.4 MB, 在所有 C 提交中击败了64.56%的用户