剑指Offer43:1~n整数中1出现的次数(数位DP)
解题思路:数位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)的更多相关文章
- 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算
剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...
- 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或
剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...
- 剑指 Offer 43. 1~n 整数中 1 出现的次数 + 数位模拟 + 思维
剑指 Offer 43. 1-n 整数中 1 出现的次数 Offer_43 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author ...
- 剑指offer系列57---整数中1出现的次数
[题目]求出1~n的整数中1出现的次数.(10进制) package com.exe11.offer; /** * [题目]求出1~n的整数中1出现的次数. * @author WGS * */ pu ...
- 剑指 Offer 56 - II. 数组中数字出现的次数 II
题目描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例1: 输入:nums = [3,4,3,3] 输出:4 示例2: 输入:nums = ...
- 剑指 Offer 56 - I. 数组中数字出现的次数
题目描述 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是\(O(n)\),空间复杂度是\(O(1)\). 示例1: 输入:nums ...
- 《剑指offer》面试题32----从1到n整数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次. 解法一:不考虑时间效率的解法(略) ps ...
- 剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)
剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)2014-02-05 23:03 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直 ...
- 剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数)
剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数) 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https:// ...
- Go语言实现:【剑指offer】整数中1出现的次数(从1到n整数中1出现的次数)
该题目来源于牛客网<剑指offer>专题. 求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1.10.1 ...
随机推荐
- 《Kali渗透基础》08. 弱点扫描(二)
@ 目录 1:OpenVAS / GVM 1.1:介绍 1.2:安装 1.3:使用 2:Nessus 2.1:介绍 2.2:安装 2.3:使用 3:Nexpose 本系列侧重方法论,各工具只是实现目标 ...
- MyBatis-Plus和PageHelper冲突导致Factory method sqlSessionFactory threw exception,并且如何分页显示全部
springboot开始引入了mybaits-plus.后来想引入pagehelper进行分页,引入之后报错 Error starting ApplicationContext. To display ...
- Microsoft Build 2021大会开始后,Develop Blog一系列更新
.NET BLOG 发布.NET 6预览版4 https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-4/ 发布.NET MAUI ...
- Solution -「洛谷 P3267」「JLOI 2016」「SHOI 2016」侦察守卫
Description Link. 给你一棵树,放置守卫在某个点上面需要一定代价和一定的有效范围.让你覆盖若干指定点,求最小代价 Solution 算法标签: $\ \ \ \ \ \ \ \ \ $ ...
- 什么是 x10 开发工具?「GitHub 热点速览」
都听过 10x 工程师,一个人顶得过十个人.但是并不是每个人都是 10x 工程师,但是有些效率工具可能让你变成 2x.3x 的工程师.比如,这周火爆的 3D 游戏引擎 FlaxEngine 有着强大的 ...
- linux的认知与基本命令
一.linux的了解 1. 什么是Linux? a,Linux是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布.它主要受到Mi ...
- 爽。。。一键导出 MySQL 表结构,告别手动梳理表结构文档了。。。
背景 系统需要交付,客户要求提供交维材料,包括系统的表结构,安排开发人员进行梳理,效率比较慢,遂自己花点时间捣鼓一下,发现有此插件,记录一下方便与同事分享 前提条件 必须有 go语言环境,有的话直接看 ...
- Mind2Web: Towards a Generalist Agent for the Web 论文解读
主页:https://osu-nlp-group.github.io/Mind2Web 训练集:https://huggingface.co/datasets/osunlp/Mind2Web 概要 本 ...
- oracle RAC redhat
RAC比较严格,如果操作系统不纯净,容易失败: 装备第一台VM:chkconfig sendmail offchkconfig iptables offchkconfig ip6talbes offs ...
- Apache协议原文及中文翻译
Apache协议原文及中文翻译 参考链接 原文 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TER ...
