https://leetcode.com/problems/count-numbers-with-unique-digits/description/
最暴力的写法:
如果位数n >= 10,那么其实真正有效的也就10位。
分两种情况,
(1)第一位不是0,那么总的种数是 9 * 9 * 8 * 7 。。。
(2)第一位是0, 总的种数要枚举先导0的个数,具体计算跟(1)一样,如果说这个题是dp题的话重复状态可能就在这里了。。
暴力版本:
class Solution { public: int countNumbersWithUniqueDigits(int n) { if (n == 0) return 1; if (n == 1) return 10; if (n == 2) return 91; if ( n > 10) n = 10; int dp[n+1]; dp[0] = 1; dp[1] = 10; dp[2] = 91; int ret = 9, t = 9; for (int i = n-1; i >= 1; i--) { ret *= t; t --; } for (int i = 1; i < n; i++) { if (i == n-1) { ret += 10; continue; } //表示先导0的个数 int c = 9; t = 9; for (int j = n - i - 1; j >= 1; j-- ) { c *= t; t --; } ret += c; } return ret; } };
dp
class Solution { public: int countNumbersWithUniqueDigits(int n) { if (n == 0) return 1; if ( n > 10) n = 10; int dp[n+1]; dp[1] = 10; int t = 9, last = 9; for (int i = 2; i <= n; i++) { last *= t; dp[i] = dp[i-1] + last; t --; } return dp[n]; // if (n == 1) return 10; // if (n == 2) return 91; // if ( n > 10) n = 10; // int dp[n+1]; // dp[0] = 1; // dp[1] = 10; // dp[2] = 91; // int ret = 9, t = 9; // for (int i = n-1; i >= 1; i--) { // ret *= t; // t --; // } // for (int i = 1; i < n; i++) { // if (i == n-1) { // ret += 10; // continue; // } // //表示先导0的个数 // int c = 9; // t = 9; // for (int j = n - i - 1; j >= 1; j-- ) { // c *= t; // t --; // } // ret += c; // } // return ret; } };
class Solution { public: int countNumbersWithUniqueDigits(int n) { if (n == 0) return 1; if ( n > 10) n = 10; int dp = 10, t = 9, last = 9; for (int i = 2; i <= n; i++) { last *= t; dp += last; t --; } return dp; // int dp[n+1]; // dp[1] = 10; // int t = 9, last = 9; // for (int i = 2; i <= n; i++) { // last *= t; // dp[i] = dp[i-1] + last; // t --; // } // return dp[n]; } };