0%

leetcode Count Numbers with Unique Digits

leetcode Count Numbers with Unique Digits

Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n.

Example: Given n = 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding [11,22,33,44,55,66,77,88,99])

题目地址:leetcode Count Numbers with Unique Digits

题意:给定非负的整数n,求在 0 ≤ x < 10n  中,有多少每个位上的数字互不相同的数? 如 n =2 时,范围为[0,100], 共有91个数(除了11,22,33,44,55,66,77,88,99)

思路:

排列组合题。

设i为长度为i的各个位置上数字互不相同的数。

  • i==1 : 1 0(0~9共10个数,均不重复)
  • i==2: 9 * 9 (第一个位置上除0外有9种选择,第2个位置上除第一个已经选择的数,还包括数字0,也有9种选择)
  • i ==3: 9* 9 * 8 (前面两个位置同i==2,第三个位置除前两个位置已经选择的数还有8个数可以用)
  • ……
  • i== n: 9 * 9 * 8 *…… (9-i+2)

需要注意的是,9- i + 2 >0 即 i < 11,也就是i最大为10,正好把每个数都用了一遍。

so , 其实可以算出来然后打表的,然后速度就飞快→_→

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
n = min(n,10);
vector<int> dp(n + 1, 9);
dp[0] = 1;
for(int i = 2;i<=n;i++){
for(int x = 9; x >= 9 - i + 2;x--){
dp[i] *= x;
}
}
int ans = 0;
for(int i= 0;i<dp.size();i++) ans += dp[i];
return ans;
}
};

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Solution {
public int countNumbersWithUniqueDigits(int n) {
n = Math.min(n,10);
int[] dp = new int[n+1];
dp[0] = 1;
for(int i = 1;i<=n;i++){
dp[i] = 9;
for(int x = 9; x >= 9 - i + 2;x--){
dp[i] *= x;
}
}
int ans = 0;
for(int i= 0;i<dp.length;i++) ans += dp[i];
return ans;
}
}


Python

1
2
3
4
5
6
7
8
9
10
11
12
class Solution(object):
def countNumbersWithUniqueDigits(self, n):
"""
:type n: int
:rtype: int
"""
n = min(n, 10)
dp = [1] + [9] * n # 9 - n + 2 > 0 => 11 > n
for i in xrange(2, n + 1):
for x in xrange(9, 9 - i + 1, -1):
dp[i] *= x
return sum(dp)

 

本题是leetcode 357 Count Numbers with Unique Digits 题解

更多题解可以查看:https://www.hrwhisper.me/leetcode-algorithm-solution/

请我喝杯咖啡吧~