LeetCode 每日一题842. 将数组拆分成斐波那契序列

842. 将数组拆分成斐波那契序列

给定一个数字字符串 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 拆分出来的任意一组斐波那契式的序列块,如果不能拆分则返回 []。

示例 1:

输入:"123456579"
输出:[123,456,579]

示例 2:

输入: "11235813"
输出: [1,1,2,3,5,8,13]

示例 3:

输入: "112358130"
输出: []
解释: 这项任务无法完成。

示例 4:

输入:"0123"
输出:[]
解释:每个块的数字不能以零开头,因此 "01""2""3" 不是有效答案。

示例 5:

输入: "1101111"
输出: [110, 1, 111]
解释: 输出 [11,0,11,11] 也同样被接受。

提示:

  • 1 <= S.length <= 200
  • 字符串 S 中只含有数字。

解题思路:

没做出来~,参考的官方解答。

本质上还是暴力解法,只是暴力的更优美~。使用「回溯」+「剪枝」大大提升了效率。解释在代码注释中。

方法一:回溯 + 剪枝

public List<Integer> splitIntoFibonacci(String S) {
     
    List<Integer> list = new ArrayList<>();
    backtrack(list, S, 0);
    return list;
}

public boolean backtrack(List<Integer> list, String S, int index) {
     
    // 递归终止条件,遍历到末尾时,数组长度必须大于等于3
    if (index == S.length()) {
     
        return list.size() >= 3;
    }

    for (int i = index; i < S.length(); i++) {
     
        // 排除首位是 0
        if (i > index && S.charAt(index) == '0') {
     
            break;
        }
        // 用long 接收,避免超过int 最大值
        long longValue = Long.parseLong(S.substring(index, i + 1));
        if (longValue > Integer.MAX_VALUE) {
     
            break;
        }
        int intValue = (int) longValue;
        // 数组有两个以上的元素时,当前值必须等于末尾两个元素的和
        if (list.size() >= 2) {
     
            int sum = list.get(list.size() - 1) + list.get(list.size() - 2);
            if (intValue < sum) {
     
                continue;
            } else if (intValue > sum) {
     
                break;
            }
        }
        list.add(intValue);
        // 继续向下递归,失败说明当前元素不存在解,删除当前元素
        if (!backtrack(list, S, i + 1)) {
     
            list.remove(list.size() - 1);
        } else {
     
            return true;
        }
    }
    return false;
}

执行结果

在这里插入图片描述

你可能感兴趣的:(每日一题,java,leetcode,递归算法)