当前位置: 首页 > news >正文

单调不减序列查询第一个大于等于_【算法打卡】将数组拆分成斐波那契序列

c33aadb34758245e0c12b46acf0b88bb.png

难度:中等

题目:

    给定一个数字字符串 S,比如 S = "123456579",我们可以将它分成斐波那契式的序列 [123, 456, 579]

    形式上,斐波那契式序列是一个非负整数列表 F,且满足:

  • 0 <= F[i] <= 2^31 - 1,(也就是说,每个整数都符合 32 位有符号整数类型);

  • F.length >= 3

  • 对于所有的0 <= i < F.length - 2,都有 F[i] + F[i+1] = F[i+2] 成立。

    另外,请注意,将字符串拆分成小块时,每个块的数字一定不要以零开头,除非这个块是数字 0 本身。    

    返回从 S 拆分出来的任意一组斐波那契式的序列块,如果不能拆分则返回 []

2d57992cedb1e9f90d5d2d0f556056e9.png

-------------------------------------------------------

思考:

    数组分割成斐波那契序列

    我们都知道,斐波那契序列是a[i]中,a[i-2]+a[i-1]=a[i],任意三个连续的数,前两项和等于第三项。

    以前大学都写过斐波那契序列的,直接就是一个递归,

    更甚者,硬编码的,b89f519b3f13368ab8db03622cef59c8.png

ca7a93d0c0022d87858b72a9a4155f4a.png

    号称史上最快算斐波那契数的,时间空间都是O(1)。

0541c88f4dcd44ea50feabfd2b9a247b.png

    那能不能直接写把斐波那契数拿去匹配呢,不在这30个斐波那契数的就直接返回false。

    答案就是不行。满脑子都是偷鸡。

    因为题目都说了,数字不能以 0 开头,而且示例也有说,那不是正经的斐波那契序列,而是用他的计算方式。而且不定长度,有可能11,0,11这种,也算。

    固然只能实在的。

    那可以来个编码。俗称暴力,民间流传为不讲码德。

    从第一个数1位,第二个数1位,第三个数 1 位开始,如果满足a[i-2]+a[i-1]=a[i],就向后移动三位。

    否则就是第一个数1位,第二个数1位,第三个数 2 位开始,

    第一个数 2 位,第二个数1位,第三个数 1 位开始,如果满足a[i-2]+a[i-1]=a[i],就向后移动三位。

(十年之后)

    直到刚好取到字符串最后一位而且满足a[i-2]+a[i-1]=a[i]。那就是成立。

    否则false。

看起来很蠢。

    可以这样做,但是确实有点蠢,因为太多不必要操作。

    例如:

        第一个数1位,第二个数1位,第三个数 2 位开始。如果最后那个数两位都不满足就没必要向后加了。

        还有就是,第一个数 2 位,第二个数1位,第三个数 1 位开始,那是必然不成立的,因为第一个都比第三个数大了

所以肯定还有优化空间的。

这时候回溯法就不请自来了。

回溯法概念:

    回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

    白蜡,就是,

    例如上面的例子中,第一个数1位,第二个数1位,判断完第三个数 2 位不成立后,就不再去判断第三个数三位的情况了,直接返回到第二位取两位,然后继续第三位的操作。

    当第二位超出了一定大小例如Integer.MAX_VALUE,后也不再判断后面位数,跳回到第一位,第一位取两位,然后再往后走。

    简单如图:(示例1)

ba0c20f58ab183d964b7805f66b999bd.png

    这个方法在经典的8皇后问题中特别经典,反正就是经典

递归代码实现:

public ListsplitIntoFibonacci(String S) {    List res = new ArrayList<>();    backtrack(S.toCharArray(), res, 0);    return res;}public boolean backtrack(char[] digit, List res, int index) {//边界条件判断,如果截取完了,并且res长度大于等于3,表示找到了一个组合。    if (index == digit.length && res.size() >= 3) return true;    for (int i = index; i < digit.length; i++) {//两位以上的数字不能以0开头        if (digit[index] == '0' && i > index) break;//截取字符串转化为数字        long num = subDigit(digit, index, i + 1);//如果截取的数字大于int的最大值,则终止截取        if (num > Integer.MAX_VALUE) break;        int size = res.size();//如果截取的数字大于res中前两个数字的和,说明这次截取的太大,直接终止,因为后面越截取越大        if (size >= 2 && num > res.get(size - 1) + res.get(size - 2)) break;        if (size <= 1 || num == res.get(size - 1) + res.get(size - 2)) {//把数字num添加到集合res中            res.add((int) num);//如果找到了就直接返回            if (backtrack(digit, res, i + 1)) return true;//如果没找到,就会走回溯这一步,然后把上一步添加到集合res中的数字给移除掉            res.remove(res.size() - 1);        }    }    return false;}//相当于截取字符串S中的子串然后转换为十进制数字private long subDigit(char[] digit, int start, int end) {    long res = 0;    for (int i = start; i < end; i++) res = res * 10 + digit[i] - '0';    return res;}

时间复杂度:最坏情况,O(n!)

空间复杂度:O(n)

----------------------------------完--------------------------------

objection

相关文章:

  • python怎样进行主键合并_如何在Djang中为我的模型设置两个主键字段
  • python捕捉warning_python – 捕获OptimizeWarning作为例外
  • python 复制图片到剪贴板_JS实现将图片复制到剪贴板
  • 马斯洛需求的五个层次_如何合理满足孩子需求?善用马斯洛需求层次理论,你也是聪明家长...
  • python调用api做用户登录认证_Python构建RESTful网络服务[Django篇:用户接入控制,认证与权限]...
  • pythonocc安装_PythonOCC开发-如何搭建开发环境和一个创建圆台例子
  • python怎么找到视频教程_哪里能找到 Python 视频教程地址?
  • mybatis嵌套子查询_InfluxDB常见问题和解答 - 如何在InfluxDB中实现嵌套子查询
  • select子查询返回 值_从零学会SQL:复杂查询,D4
  • python concat axis_Python NumPy中sum()函数详解 axis与keepdims图解
  • python echarts mysql_Django中从mysql数据库中获取数据传到echarts方式
  • skywalking原理_链路追踪 SkyWalking 源码分析——Collector Naming Server 命名服务
  • python print 调试_python 调试: print / assert / logging / pdb
  • 信息系统项目管理师论文_高级软考信息系统项目管理师考试技巧之论文摘要
  • imp oracle reschema_Oracle数据库逻辑备份之exp/imp(一)
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • Apache Pulsar 2.1 重磅发布
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Debian下无root权限使用Python访问Oracle
  • JavaScript新鲜事·第5期
  • js中forEach回调同异步问题
  • Laravel Mix运行时关于es2015报错解决方案
  • Linux Process Manage
  • NSTimer学习笔记
  • PAT A1120
  • PHP的类修饰符与访问修饰符
  • springboot_database项目介绍
  • Swoft 源码剖析 - 代码自动更新机制
  • vue-loader 源码解析系列之 selector
  • vue自定义指令实现v-tap插件
  • 从输入URL到页面加载发生了什么
  • 规范化安全开发 KOA 手脚架
  • 记一次删除Git记录中的大文件的过程
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端之React实战:创建跨平台的项目架构
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 深度学习在携程攻略社区的应用
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #stm32驱动外设模块总结w5500模块
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (1)Android开发优化---------UI优化
  • (13):Silverlight 2 数据与通信之WebRequest
  • (30)数组元素和与数字和的绝对差
  • (9)目标检测_SSD的原理
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...