【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);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值