数据结构学习 jz43 数字 1 的个数

本文详细介绍了使用数位dp(动态规划)解决一个问题的方法,涉及时间复杂度O(log^2n)和空间复杂度O(log^2n),并提供了代码示例,展示了如何计算一个整数中1的个数,以及对状态转移和复杂度的讨论。
摘要由CSDN通过智能技术生成

关键词:数位dp 记忆化搜索 dfs

专门写了数位dp的笔记,里面的第一题和这个是一模一样的。建议直接看链接。

题目:

复杂度计算:

时间复杂度O(log^2 n)

时间复杂度 = 状态个数 * 单个状态的转移次数,状态个数就是 dp 数组的长度,即 O(log^2 n) ,而单个状态的转移次数 = O(10) = O(1),所以时间复杂度为 O(log^2 n)

空间复杂度O(log^2 n) 

代码:

class Solution {
public:
    int fun(int pose,bool islimit,int count, vector<vector<int>>& dp)
    {
        if(pose<0) return count;
        if(!islimit&&dp[pose][count]>=0) return dp[pose][count];
        int temp=0;
        int up=islimit?s[pose]:9;
        for(int i=0;i<=up;++i)
        {
            temp=temp+fun(pose-1,islimit&&i==s[pose],count+(i==1),dp);
        }
        if(!islimit)dp[pose][count]=temp;
        return temp;
    }
    int countDigitOne(int n) {
        while(n)
        {
            s.push_back(n%10);
            n=n/10;
        }
        vector<vector<int>> dp(s.size(),vector<int>(s.size()+1,-1));
        return fun(s.size()-1,true,0,dp);
    }
    vector<int> s;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值