leetcode每日一题 357.统计各位数字都不同
方法1:暴力破解,遍历每一种可能
class Solution {
public int countNumbersWithUniqueDigits(int n) {
boolean[] buf = new boolean[10];
return x(buf, 0, n, true);
}
private int x(boolean[] buf, int i, int n, boolean b) {
if (i > n) {
return 0;
}
if (i == n) {
return 1;
}
int count = 0;
for (int j = 0; j < buf.length; j++) {
if ((b && j == 0) || !buf[j]) {
buf[j] = true;
b = b && j == 0;
count += x(buf, i + 1, n, b);
buf[j] = false;
}
}
return count;
}
}

方法2:性能最佳实践(官网)
class Solution {
public int countNumbersWithUniqueDigits(int n) {
if (n == 0) {
return 1;
}
if (n == 1) {
return 10;
}
int res = 10, cur = 9;
for (int i = 0; i < n - 1; i++) {
cur *= 9 - i;
res += cur;
}
return res;
}
}
方法3:内存最佳实践(官网)
class Solution {
public int countNumbersWithUniqueDigits(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
if (n < 1) {
return dp[n];
}
dp[1] = 10;
int mul = 9;
for (int i=2; i<=n; ++i) {
mul *= (11 - i);
dp[i] = mul +dp[i-1];
}
return dp[n];
}
}