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);
            }
        }        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值