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

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

题干

题解

接下来的题解并不是一上来就是正确的答案,而是按照作者的思维步骤一步步完善得到最终的正确答案,如果不想看排错部分可以直接跳到文末
一开始没啥思路,瞥了眼标签写出来个回溯算法,因为递归部分的参数一开始没想好,想到一个加一个,所以顺序有点反人类

class Solution {
    
    
public:
    bool dfs(string& S,int SLength,int pre,int index,int sum,vector<int>& ans){
    
    
        if(index == SLength){
    
    
            return ans.size() >= 3;
        }
        int currentNum = 0;
        for(int i = index ; i < SLength ; ++i){
    
    
            currentNum = currentNum * 10 + (int)S[i] - '0';
            if(ans.size() >= 2){
    
    
                if(currentNum > sum){
    
    
                    break;
                }else if(currentNum < sum){
    
    
                    //数字还小存在可能,跳过递归部分,先在currentNum上取下一位的数字
                    continue;
                }
            }
            ans.push_back(currentNum);
            if(dfs(S,SLength,currentNum,i+1,pre+currentNum,ans)){
    
    
                return true;
            }
            ans.pop_back();
        }
        return false;
    }

    vector<int> splitIntoFibonacci(string S) {
    
    
        vector<int> ans;
        int n = S.length();
        if(n<3) return ans;
        dfs(S,n,0,0,0,ans);
        return ans;
    }
};

然后发现没有考虑0的情况,0只能作为单独的数或者开头,于是在循环中加了一句:

if(currentNum == 0 && i > index) break;

当0作为某个数的开头时直接break return false

class Solution {
    
    
public:
    bool dfs(string& S,int SLength,int pre,int index,int sum,vector<int>& ans){
    
    
        if(index == SLength){
    
    
            return ans.size() >= 3;
        }
        int currentNum = 0;
        for(int i = index ; i < SLength ; ++i){
    
    
            if(currentNum == 0 && i > index) break;
            currentNum = currentNum * 10 + (int)S[i] - '0';
            if(ans.size() >= 2){
    
    
                if(currentNum > sum){
    
    
                    break;
                }else if(currentNum < sum){
    
    
                    //数字还小存在可能,跳过递归部分,先在currentNum上取下一位的数字
                    continue;
                }
            }
            ans.push_back(currentNum);
            if(dfs(S,SLength,currentNum,i+1,pre+currentNum,ans)){
    
    
                return true;
            }
            ans.pop_back();
        }
        return false;
    }

    vector<int> splitIntoFibonacci(string S) {
    
    
        vector<int> ans;
        int n = S.length();
        if(n<3) return ans;
        dfs(S,n,0,0,0,ans);
        return ans;
    }
};

然后发现在累加currentNum的过程中溢出了…
于是把currentNum和sum的数据类型都改为long long,顺带注意到主函数的返回值类型是int,所以干脆currentNum溢出整形就break

class Solution {
    
    
public:
    bool dfs(string& S,int SLength,int pre,int index,long long sum,vector<int>& ans){
    
    
        if(index == SLength){
    
    
            return ans.size() >= 3;
        }
        long long currentNum = 0;
        for(int i = index ; i < SLength ; ++i){
    
    
            if(currentNum == 0 && i > index) break;
            currentNum = currentNum * 10 + (int)S[i] - '0';
            if(currentNum > INT_MAX) break;
            if(ans.size() >= 2){
    
    
                if(currentNum > sum){
    
    
                    break;
                }else if(currentNum < sum){
    
    
                    //数字还小存在可能,跳过递归部分,先在currentNum上取下一位的数字
                    continue;
                }
            }
            ans.push_back(currentNum);
            if(dfs(S,SLength,currentNum,i+1,pre+currentNum,ans)){
    
    
                return true;
            }
            ans.pop_back();
        }
        return false;
    }

    vector<int> splitIntoFibonacci(string S) {
    
    
        vector<int> ans;
        int n = S.length();
        if(n<3) return ans;
        dfs(S,n,0,0,0,ans);
        return ans;
    }
};

然后就过了…

最终答案:

class Solution {
    
    
public:
    bool dfs(string& S,int SLength,int pre,int index,long long sum,vector<int>& ans){
    
    
        if(index == SLength){
    
    
            return ans.size() >= 3;
        }
        long long currentNum = 0;
        for(int i = index ; i < SLength ; ++i){
    
    
            if(currentNum == 0 && i > index) break;
            currentNum = currentNum * 10 + (int)S[i] - '0';
            if(currentNum > INT_MAX) break;
            if(ans.size() >= 2){
    
    
                if(currentNum > sum){
    
    
                    break;
                }else if(currentNum < sum){
    
    
                    //数字还小存在可能,跳过递归部分,先在currentNum上取下一位的数字
                    continue;
                }
            }
            ans.push_back(currentNum);
            if(dfs(S,SLength,currentNum,i+1,pre+currentNum,ans)){
    
    
                return true;
            }
            ans.pop_back();
        }
        return false;
    }

    vector<int> splitIntoFibonacci(string S) {
    
    
        vector<int> ans;
        int n = S.length();
        if(n<3) return ans;
        dfs(S,n,0,0,0,ans);
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43662405/article/details/110912818
今日推荐