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将数组拆分成斐波那契序列的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 0873.最长的斐波那契子序列的长度

最强解析面试题:Goland 并发版斐波那契数列

最强解析面试题:Goland 并发版斐波那契数列

最长斐波那契序列-LeetCode-873

[LeetCode] 509. 斐波那契数

LeetCode 873. 最长的斐波那契子序列的长度