解题思路:数位DP。dp数组为dp[pos][sum]表示当前位以下还有pos个可变位并且当前位以及它的最高位出现了sum个1的dp值。因为数的取值为2^31所以,数组开dp[10][10]就够了。

数位DP入门博客:

https://www.luogu.com.cn/blog/virus2017/shuweidp#

https://blog.csdn.net/qq_25957237/article/details/102877820

 1 class Solution:
2 def dfs(self,pos,one_sum,limit):
3 #如果剩余可变位为0,范围当前数所有的one_sum,即当前状态的之前位有多少个1了
4 if pos==0:
5 return one_sum
6 #如果没有受限并且dp值被记录过了,直接返回状态值
7 if not limit and self.dp[pos][one_sum]!=-1:
8 return self.dp[pos][one_sum]
9 up = 9
10 if limit:
11 up = self.nums[pos-1]
12 ans =0
13 for i in range(up+1):
14 #状态转移方程:如果当前位是1,那么next_one_sum +=1
15 if i==1:
16 nxt_one_sum = one_sum + 1
17 else:
18 nxt_one_sum = one_sum
19 #搜索下一位,下一个状态的limit的由当前limit控制并且当前的值真的到了当前位的限制值.
20 #以365为例,搜索0??,1??,2??的limit都为false,只有当搜索3??的时候才继续为真.
21 ans+= self.dfs(pos-1,nxt_one_sum, limit and i==self.nums[pos-1])
22
23 if not limit:#如果没有限制,说明下次再访问dp[pos][one_sum]的状态是一样的,记忆化
24 self.dp[pos][one_sum] = ans
25 return ans
26
27 def solve(self,n):
28 self.nums = []
29 while n:
30 self.nums.append(n%10)
31 n//=10
32 #自高位向低位进行数位dp,因为从高位开始dp,因此limit为真
33 return self.dfs(len(self.nums),0,True)
34 def countDigitOne(self, n):
35 # dp[pos][sum]表示当前位以下还有pos个可变位并且当前位以及它的最高位出现了sum个1的dp值
36 #比如对于356这个数,0??的dp值应该与2??dp值一样为dp[2][0],但是与3??的dp值不同,因为3是最高位,受到limit的制约
37 #它不能保存dp值,除非再添加一个limit的维度(dp[10][10][2]),1??的dp值为dp[2][1]
38 self.dp = [[-1]*10 for _ in range(10)]
39 cnt = self.solve(n)
40 #print(self.dp[2][0])
41 #print(self.dp[2][1])
42 return cnt
43
44
45
46 c = Solution()
47 #n = 302
48 z = c.countDigitOne(365)
49 print(z)

剑指Offer43:1~n整数中1出现的次数(数位DP)的更多相关文章

  1. 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算

    剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...

  2. 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或

    剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...

  3. 剑指 Offer 43. 1~n 整数中 1 出现的次数 + 数位模拟 + 思维

    剑指 Offer 43. 1-n 整数中 1 出现的次数 Offer_43 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author ...

  4. 剑指offer系列57---整数中1出现的次数

    [题目]求出1~n的整数中1出现的次数.(10进制) package com.exe11.offer; /** * [题目]求出1~n的整数中1出现的次数. * @author WGS * */ pu ...

  5. 剑指 Offer 56 - II. 数组中数字出现的次数 II

    题目描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例1: 输入:nums = [3,4,3,3] 输出:4 示例2: 输入:nums = ...

  6. 剑指 Offer 56 - I. 数组中数字出现的次数

    题目描述 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是\(O(n)\),空间复杂度是\(O(1)\). 示例1: 输入:nums ...

  7. 《剑指offer》面试题32----从1到n整数中1出现的次数

    题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次. 解法一:不考虑时间效率的解法(略) ps ...

  8. 剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)

    剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)2014-02-05 23:03 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直 ...

  9. 剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数)

    剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数) 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https:// ...

  10. Go语言实现:【剑指offer】整数中1出现的次数(从1到n整数中1出现的次数)

    该题目来源于牛客网<剑指offer>专题. 求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1.10.1 ...

随机推荐

  1. mysqlbinlog输出sql

    ./mysqlbinlog -v --base64-output=DECODE-ROWS ~/Downloads/tymysql2|grep -A4 'ALTER' >~/Downloads/a ...

  2. dedebiz数据重置

    TRUNCATE biz_addonarticle;TRUNCATE biz_addonimages;TRUNCATE biz_addoninfos;TRUNCATE biz_addonshop;TR ...

  3. 熟练掌握并充分利用CSS3的新特性,更新完毕。

    1.1  尝试新颖的CSS3特性 首先,我们来看一个具体的案例.  https://code.juejin.cn/pen/7277536985772720139   1.2  CSS3新特性简介和浏览 ...

  4. MySQL运维1-日志

    一.错误日志 错误日志是MySQL中最重要的日志之一,它记录了当MySQL启动和停止时,以及服务器在运行过程中发生的任何严重错误时的相关信息,当数据库出现任何故障导致无法正常使用时,建议首先查看此日志 ...

  5. c语言代码练习2(2)改进

    //利用for循环计算1-10阶乘的和#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main( ) { int num ...

  6. 前端三件套系例之JQuery——JQuery基础、JQuery选择器、JQuery文本属性样式操作、JQuery操作DOM

    文章目录 1 JQuery基础 1. 了解jQuery 1.1 什么是jQuery 1.2 什么事JS类库 1.3 常见JS类库 1.4 jQuery的优势 1.5 jQuery的版本 1.6 jQu ...

  7. 使用 QuickTime Player 将手机投屏到旧版 Macbook pro

    由于旧版的 MacBook Pro 不支持 AirPlay,我们可以通过Mac系统自带的应用程序[QuickTime Player]来进行投屏操作. 以下是具体的步骤: 首先,使用USB数据线将你的 ...

  8. jenkins 原理篇——pipeline流水线 声明式语法详解

    大家好,我是蓝胖子,相信大家平时项目中或多或少都有用到jenkins,它的piepeline模式能够对项目的发布流程进行编排,优化部署效率,减少错误的发生,如何去写一个pipeline脚本呢,今天我们 ...

  9. 组合的输出 题解(lgP1157)

    一看就是 dfs 然而窝并不会做 调了一个多小时才调出来.漏洞连篇.(第一次写的基本没有对的地方QAQ 题解见注释. #include<bits/stdc++.h> using names ...

  10. 洛谷1451(BFS)

    #include"bits/stdc++.h" using namespace std; int mp[110][110]; bool vis[110][110]; int dx[ ...