leetcode中等842将数组拆分成斐波那契序列
Posted qq_40707462
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等842将数组拆分成斐波那契序列相关的知识,希望对你有一定的参考价值。
给定一个数字字符串 num,比如 “123456579”,我们可以将它分成「斐波那契式」的序列 [123, 456, 579]。
形式上,斐波那契式 序列是一个非负整数列表 f,且满足:
- 0 <= f[i] < 231 ,(也就是说,每个整数都符合 32 位 有符号整数类型)
- f.length >= 3
- 对于所有的0 <= i < f.length - 2,都有 f[i] + f[i + 1] = f[i + 2]
- 另外,请注意,将字符串拆分成小块时,每个块的数字一定不要以零开头,除非这个块是数字 0 本身。
返回从 num 拆分出来的任意一组斐波那契式的序列块,如果不能拆分则返回 []。
示例 1:
输入:num = "1101111"
输出:[11,0,11,11]
解释:输出[110,1,111]也可以。
示例 2:
输入:"0123"
输出:[]
解释:每个块的数字不能以零开头,因此 "01","2","3" 不是有效答案。
class Solution
List<Integer>res=new ArrayList<>();
List<Integer>ans=new ArrayList<>();
public List<Integer> splitIntoFibonacci(String num)
if(num.length()<3) return res;
int[]nums=new int[num.length()];
for(int i=0;i<num.length();i++) nums[i]=num.charAt(i)-'0';
dfs(nums,0);
return ans;
public void dfs(int[]nums,int depth)
if(depth==nums.length && res.size()>=3)
ans=new ArrayList<>(res);
return;
for(int i=depth;i<nums.length;i++)
if(nums[depth]==0 && i>depth) return;//多位数不能以0开头
long cur=0;
for(int j=depth;j<=i;j++) cur=cur*10+nums[j];
if(cur>Integer.MAX_VALUE) return;
//第三个数太大了
if(res.size()>=2&&cur>res.get(res.size()-1)+res.get(res.size()-2)) return;
//合法
if(res.size()<=1||cur==res.get(res.size()-1)+res.get(res.size()-2))
res.add((int)cur);
dfs(nums,i+1);
res.remove(res.size()-1);
以上是关于leetcode中等842将数组拆分成斐波那契序列的主要内容,如果未能解决你的问题,请参考以下文章