[Leetcode] 第306题 累加数
一、题目描述
累加数是一个字符串,组成它的数字可以形成累加序列。
一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。
给定一个只包含数字 '0'-'9'
的字符串,编写一个算法来判断给定输入是否是累加数。
说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03
或者 1, 02, 3
的情况。
示例 1:
输入:"112358"
输出: true 解释: 累加序列为:1, 1, 2, 3, 5, 8
。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
示例 2:
输入:"199100199"
输出: true 解释: 累加序列为:1, 99, 100, 199。
1 + 99 = 100, 99 + 100 = 199
二、题目分析
1)情况非常多,采用回溯的方法
2)特殊情况:以0为开头的非零整数;特大数long long
3)具体解析请看代码注释
三、实现代码
1 class Solution { 2 public: 3 bool isAdditiveNumber(string num) { 4 int n = num.size(); 5 if (n < 3)return false; 6 long long ppre = 0, pre = 0; 7 //找出第一个数和第二个数 8 for (int i = 1; i <= n / 2; ++i) {//第一个数的长度不能超过n/2 9 ppre = stoi(num.substr(0, i)); 10 for (int j = 1; i + j <= (n * 2) / 3; ++j) {//第一个和第二个数总的长度不能超过2/3 11 pre = stoi(num.substr(i, j));//从位置i开始截取 12 if (dfs(i + j, max(i, j), pre, ppre, num))return true;//第二个数不一定比第一个数大 13 } 14 } 15 return false; 16 } 17 private: 18 /** 19 * 计算当前的数是不是前两个数的和 20 * pos代表当前指针达到的位置 21 * len代表要截取的长度 22 * pre代表前面的数 23 * ppre代表前一个的前一个数 24 * s代表字符串 25 */ 26 bool dfs(int pos, int len, long long pre, long long ppre, string &s) { 27 int n = s.size(); 28 if (pos == n)return true;//已经计算到最后了 29 bool flag = false; 30 long long cur = 0; 31 for (int i = len; pos + i <= n; ++i) { 32 cur = stoi(s.substr(pos, i)); 33 if (cur > pre + ppre)break;//当前的数大于两者之和,就跳出循环,不能再截取更长的长度了 34 if (cur < pre + ppre)continue;//如果当前的数小于两者之和,就截取更长的一位 35 flag = dfs(pos + i, i, cur, pre, s);//对当前来说两者相等,继续检验,下一次的开始长度至少和前面一个一样 36 if (flag)break;//只要找到一个,就可以跳出了 37 } 38 return flag; 39 } 40 /** 41 * 把字符串转换成整数 42 */ 43 long long stoi(const string &s) { 44 if (s.size() > 1 && s[0] == '0')return -1; 45 stringstream ss(s); 46 long long res; 47 ss >> res; 48 return res; 49 } 50 51 };
需要注意的地方有:第8行和第10行的等号;第43行的const
转载于:https://www.cnblogs.com/zhizhiyu/p/10190438.html
[Leetcode] 第306题 累加数相关推荐
- Python|Leetcode《306》|累加数
专栏<LeetCode|一刷到底> 打卡每天leetcode精选每日一题(尽量不断更!) 点击关注不迷路!!! 一.题目描述 题目:累加数 难度:中等 地址:<306>累加数 ...
- Java实现 LeetCode 306 累加数
306. 累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ...
- leetcode 306 累加数(js)
题目描述 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0' ...
- LeetCode每日一题(22年1月7日-1月16日)
目录(每日一题) 1614. 括号的最大嵌套深度 89. 格雷编码 1629. 按键持续时间最长的键 306. 累加数 1036. 逃离大迷宫 334. 递增的三元子序列 747. 至少是其他数字两倍 ...
- 编写一个函数实现从 1 到 n 共 n 个数的累加_leetcode306_go_累加数
题目 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0'-' ...
- 累加数Python解法
累加数 是一个字符串,组成它的数字可以形成累加序列. 一个有效的 累加序列 必须 至少 包含 3 个数.除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和. 给你一个只包含数字 '0 ...
- LeetCode第7题:整数反转
生命无罪,健康万岁,我是laity. 我曾七次鄙视自己的灵魂: 第一次,当它本可进取时,却故作谦卑: 第二次,当它在空虚时,用爱欲来填充: 第三次,在困难和容易之间,它选择了容易: 第四次,它犯了错, ...
- 【Leetcode】 刷题之路1(python)
leetcode 刷题之路1(python) 看到有大佬总结了一些相关题目,想着先刷一类. 1.两数之和 15.三数之和 16.最接近的三数之和 11.盛最多的水 18.四数之和 454.四数相加II ...
- 15.使用一样的BFS方法(代码几乎一模一样)解决多道LeetCode题目--542题(01矩阵)1765题(地图中的最高点)994腐烂的橘子
一.综述 本文总结自己刷LeetCode中遇到的使用BFS方法解决相同类型的题目.(代码几乎是一模一样) 二.01矩阵(LeetCode第542题) class Solution {int[][] d ...
最新文章
- java基础知识一_Java基础知识(一)
- 动态规划——最优买卖股票时机含冷冻期(Leetcode 309)
- mysql云上迁移_自建mysql 迁移到云上-问答-阿里云开发者社区-阿里云
- 关于stack 和heap
- SpringBoot+JSON+AJAX+ECharts+Fiddler实现前后端分离开发可视化(进阶篇)
- idea2017+kemulator搭建J2ME开发环境
- 吉林省辽源市谷歌高清卫星地图下载
- 二乘二(二阶)魔方教程,看完教程拼不出来我给你钱!
- mysql binlog 回滚_Mysql误操作后利用binlog2sql快速回滚的方法详解
- 教你如何设计ASP网上考试系统
- Postgresql语句持续更新
- 计算机考研失败了还能找工作吗,考研失败了怎么办_考研失败还能找工作吗
- 实现HTML转PDF 多个PDF合并
- mos管的rc吸收电路计算_一种反激式开关电源中MOS管的RC吸收电路的制作方法
- Python读取Word文档内容
- 活动运营5步走,打造一场完满的线下活动
- 电商上行大势已定,店宝宝扶持新手开展网店创业
- LD3320和MP3模块搭建语音识别交互系统
- php中push数组,php中的array_push函数怎么用
- 程序员也需要这种魄力
热门文章
- E-MapReduce结合DataV进行数据展现
- Direct2D (19) : 图层之 TD2D1LayerParameters.geometricMask (使用几何图形剪裁图层)
- loadrunner脚本中参数有中文时报错
- 关于ie6下提交上传表单的注意事项
- Aix5.3安装Bash环境
- 玻璃体混浊不要转眼球
- 2021年4月12日-民航上海医院-瑞金医院古北分院-检查报告单
- Cannot resolve field [product], input field list:[user, EXPR$0]
- apt update无法连接上 127.0.0.1:10808
- 统计dataframe中所有列的null数量与填充null注意事项