LeetCode——842. 将数组拆分成斐波那契序列(深搜、贪心)

题目描述:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题思路:

12月是贪心月,难受

参考代码:

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

    private boolean backtrack(char[] digit,List<Integer> res,int index){
    
    
        if(index==digit.length&&res.size()>=3)
        {
    
    
            return true;
        }
        for (int i = index; i < digit.length; i++) {
    
    

            if(digit[index]=='0'&&i>index)
            {
    
    
                break;
            }
            long num=subDigit(digit,index,i+1);

            if(num>Integer.MAX_VALUE)
            {
    
    
                break;
            }
            int size=res.size();
            if(size>=2&&num>res.get(size-1)+res.get(size-2))
            {
    
    
                break;
            }
            if(size<2||num==res.get(size-1)+res.get(size-2))
            {
    
    
                res.add((int) num);
                if(backtrack(digit,res,i+1))
                {
    
    
                    return true;
                }
                res.remove(res.size()-1);
            }
        }
        return false;

    }

    private long subDigit(char[] digit, int start, int end) {
    
    
        long sum=0;
        for (int j = start; j <end ; j++) {
    
    
            sum=sum*10+digit[j]-'0';
        }
        return sum;
    }
    public List<Integer> splitIntoFibonacci(String S) {
    
    
        List<Integer> res = new ArrayList<>();
        backtrack(S.toCharArray(), res, 0);
        return res;
    }

    public boolean backtrack(char[] digit, List<Integer> res, int index) {
    
    
        //边界条件判断,如果截取完了,并且res长度大于等于3,表示找到了一个组合。
        if (index == digit.length && res.size() >= 3) {
    
    
            return true;
        }
        for (int i = index; i < digit.length; i++) {
    
    
            //两位以上的数字不能以0开头
            if (digit[index] == '0' && i > index) {
    
    
                break;
            }
            //截取字符串转化为数字
            long num = subDigit(digit, index, i + 1);
            //如果截取的数字大于int的最大值,则终止截取
            if (num > Integer.MAX_VALUE) {
    
    
                break;
            }
            int size = res.size();
            //如果截取的数字大于res中前两个数字的和,说明这次截取的太大,直接终止,因为后面越截取越大
            if (size >= 2 && num > res.get(size - 1) + res.get(size - 2)) {
    
    
                break;
            }
            if (size <= 1 || num == res.get(size - 1) + res.get(size - 2)) {
    
    
                //把数字num添加到集合res中
                res.add((int) num);
                //如果找到了就直接返回
                if (backtrack(digit, res, i + 1))
                    return true;
                //如果没找到,就会走回溯这一步,然后把上一步添加到集合res中的数字给移除掉
                res.remove(res.size() - 1);
            }
        }
        return false;
    }

    //相当于截取字符串S中的子串然后转换为十进制数字
    private long subDigit(char[] digit, int start, int end) {
    
    
        long res = 0;
        for (int i = start; i < end; i++) {
    
    
            res = res * 10 + digit[i] - '0';
        }
        return res;
    }

猜你喜欢

转载自blog.csdn.net/qq_44900959/article/details/110872603