【LeetCode 每日一题】1012. 至少有 1 位重复的数字(hard)

1012. 至少有 1 位重复的数字


这题在我能力范围以外,解释起来也有点复杂,具体看灵神题解吧,我就翻写了一下灵神的代码。之后有时间了会总结数位dp的题型。

class Solution {
    
    
public:
    int numDupDigitsAtMostN(int n) {
    
    
        string s=to_string(n);
        int len=s.length();
        vector<vector<int>> dp(len,vector<int> (1<<10,-1));

        function<int(int,int,bool,bool)> fun=[&] (int i,int mask,bool isLimit,bool isNum)->int{
    
    
            if(i==len) return isNum;
            if(!isLimit&&isNum&&dp[i][mask]!=-1) return dp[i][mask];
            int res=0;
            if(!isNum) res=fun(i+1,mask,false,false);
            int up=isLimit?s[i]-'0':9;
            for(int d=1-isNum;d<=up;d++){
    
    
                if((mask>>d&1)==0) res+=fun(i+1,mask|(1<<d),isLimit&&d==up,true);
            }
            if(!isLimit&&isNum) dp[i][mask]=res;
            return res;
        };

        return n-fun(0,0,true,false);
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44623371/article/details/129694991
今日推荐