*Leetcode 357. Count Numbers with Unique Digits | 思维 规律

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];
        
    }
};




猜你喜欢

转载自blog.csdn.net/u011026968/article/details/80233704