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;
}
};