题目链接
题目大意,求[0-10^n)的数中,每个数都不同的数
这是一个排列问题,举一个例子,2位数
那么第1位我们可以选择1-9,9个,第2个数我们可以选择0-9中除去1号位中选择的那个,9个,所以n=2可以组成的数就是81
那么对于一个3位数来说就是9*9*8
,我们dp[i]这里保存i位可以构成的数的个数,dp[2]=9*9
,那么我们就可以列出转移方程dp[3]=dp[2]*8;
那么我们继续推导一下就可以得出这么一个转移方程dp[i]=dp[i-1]*(10-i+1);
public int countNumbersWithUniqueDigits(int n) {
if(n==0){
return 1;
}
if(n==1){
return 10;
}
int[] dp=new int[n+1];
int sum=91;
int sum=dp[1]+dp[2];
for(int i=3;i<=n;i++){
dp[i]=dp[i-1]*(10-i+1);
sum+=dp[i];
}
return sum;
}
你以为这样就完了么,其实我们分析一下,对于这个dp数组来说,我们需要只有他的前一位,前面的我们不需要,所以我们可以直接取消dp数组用一个变量来保存他的前一位,就有
public int countNumbersWithUniqueDigits(int n) {
if(n==0){
return 1;
}
if(n==1){
return 10;
}
int sum=91;
int pre=81;
int now;
for(int i=3;i<=n;i++){
int now=pre*(10-i+1);
sum+=now;
pre=now;
}
return sum;
}
你以为这样就完了?
其实我们可以直接算出来打表,跑题了自己想吧哈哈哈