数学
public int countNumbersWithUniqueDigits(int n) {
if (n == 0) return 1;
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 10;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + (dp[i - 1] - dp[i - 2]) * (10 - (i - 1));
}
return dp[n];
}public int countNumbersWithUniqueDigits(int n) {
if (n == 0) return 1;
int ans = 10;
for (int i = 2, last = 9; i <= n; i++) {
int cur = last * (10 - i + 1);
ans += cur;
last = cur;
}
return ans;
}F(0) = 0 * A[0] + 1 * A[1] + 2 * A[2] +...+ i * A[i] +...+ (n - 1) * A[n - 1]F(1) = 0 * A[n - 1] + 1 * A[0] + 2 * A[1] +...+ (i + 1) * A[i] +...+ (n - 1) * A[n - 2]
错位相减,拿F(1)中的第二位减去F(0)中的第一位
F(1)-F(0)=0 * A[n - 1] + (1 * A[0]-0 * A[0]) + (2 * A[1]-1 * A[1]) +...+ ((i + 1) * A[i]-i * A[i]) +...+ ((n - 1) * A[n - 2] -(n - 2) * A[n - 2])-(n - 1) * A[n - 1]
整理得到
F(1)-F(0)= A[0]+A[1]+...+A[i]+...A[n-2]-(n-1)A[n-1]
多配一个A[n-1]
F(1)-F(0)= A[0]+A[1]+...+A[i]+...A[n-2]+A[n-1]- n* A[n-1]
F(1)-F(0)= sum{A[0]:A[n-1]}- n* A[n-1]
推广到一般情况,A[n-1]换成A[n-k]
F(k+1)-F(k)= sum{A[0]:A[n-1]}-n*A[n-k]
方法1:模拟
方法1:海伦公式+暴力
方法2:鞋带公式

方法3:两边a,b,这两边夹角C
lambda写法
约瑟夫环,同剑指 Offer 62. 圆圈中最后剩下的数字
动态规划参考**剑指 Offer 62. 圆圈中最后剩下的数字(数学 / 动态规划,清晰图解)**
参考链接**换个角度举例解决约瑟夫环**
动态规划优化
Last updated