842. Split Array into Fibonacci Sequence

文章目录

1 题目理解

输入:一个数字字符串S。例如S=“123456579”。
规则:我们可以把这个字符串分割为菲波那切数列,例如:[123, 456, 579]。
一个菲波那切数列需要符合以下条件:
1 0 < = F [ i ] < = 2 3 1 − 1 0 <= F[i] <= 2^31 - 1 0<=F[i]<=2311,也就是正整数
2 F[i] + F[i+1] = F[i+2] for all 0 <= i < F.length - 2.
3 在切割过程中每一块不能有前导0,例如"01"这样是错误的。但可以是"0"和"1"。
输出:分割后的菲波那切数列。如果不能分割返回空列表。

Example 1:
Input: “123456579”
Output: [123,456,579]

2 回溯

例如S=“123456579”
我们在处理’1’的时候,可以分割为1,12,123,1234… ,123456579
在处理’2’的时候,可以分割为2,23,234,…,23456579
在处理’3’的时候,可以分割为3,34,…,3456579,但是分割后能不能用,需要判断是不是符合F[i-1] + F[i-2] = F[i]。符合的话可以继续处理,否则就返回。


一直处理到最后,如果列表长度大于等于3,则说明分解成功。

class Solution {
    private String s;
    public List<Integer> splitIntoFibonacci(String S) {
        this.s = S;
        List<Integer> result = new ArrayList<Integer>();
        boolean r = dfs(0,result);
        return r ? result : new ArrayList<Integer>();
    }
    
    private boolean dfs(int start,List<Integer> list){
        if(start == s.length() && list.size()>2) return true;
        for(int i=start;i<s.length();i++){
            if(s.charAt(start)=='0' && i>start) break;
            String str = s.substring(start,i+1);
            if(Long.parseLong(str) > Integer.MAX_VALUE) break;
            int n = Integer.parseInt(str);
            if(list.size()>1){
                if(n==list.get(list.size()-1)+list.get(list.size()-2)){
                    list.add(n);
                    if(dfs(i+1,list)) return true;
                    list.remove(list.size()-1);
                }
            }else{
                list.add(n);
                if(dfs(i+1,list)) return true;
                list.remove(list.size()-1);
            }
        }
        return false;
    }
}

需要注意:字符串中可能包含0;F[i]的取值范围是正整数。我第一次刷题是在5月12日,犯了这两个错误。第二次刷题是在12月24日,依然犯了这两个错误。说明在这期间,我看题目的思维没有升级。关心了输入、输出、规则,不太在意,题目中特别说明的地方,以及每个题目在例子后面还有的说明部分。

时间复杂度:对于官方解释的我不大能明白。但有些部分可以接受。n是字符串长度。
回溯枚举过程其实枚举的是前两个数字。当前两个数字确定之后,后面的数字都确定了。回溯的过程只是一个确认的过程,时间复杂度O(n)。
枚举前两个,最坏情况下,第一个有n种枚举,第二个有n-1种枚举。所以是 O ( n ∗ ( n − 1 ) ) O(n*(n-1)) O(n(n1)),也就是 O ( n 2 ) O(n^2) O(n2)
所以最终,最坏时间复杂度 O ( n 3 ) O(n^3) O(n3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值