12/8
你管这叫难度中等???
搜索剪枝
贴一位老哥的搜索模板
private void backtrack("原始参数") {
//终止条件(递归必须要有终止条件)
if ("终止条件") {
//一些逻辑操作(可有可无,视情况而定)
return;
}
for (int i = "for循环开始的参数"; i < "for循环结束的参数"; i++) {
//一些逻辑操作(可有可无,视情况而定)
//做出选择
//递归
backtrack("新的参数");
//一些逻辑操作(可有可无,视情况而定)
//撤销选择
}
}
作者:sdwwld
链接:https://leetcode-cn.com/problems/split-array-into-fibonacci-sequence/solution/javahui-su-suan-fa-tu-wen-xiang-jie-ji-b-vg5z/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public List<Integer> splitIntoFibonacci(String S) {
List<Integer> ans = new ArrayList<>();
Judge(ans,S,0);
return ans;
}
boolean Judge(List<Integer>ans,String S,int pos){
int n=S.length();
int m=ans.size();
if(pos==n){
return m>=3;
}
//sum为现在要放入的数
int sum=0;
for(int i=pos;i<n;i++){
//有首位0的数
if(S.charAt(pos)=='0'&&i!=pos){
break;
}
sum=sum*10+S.charAt(i)-'0';
//越界int
if(sum<0){
break;
}
if(m>=2){
int bef=ans.get(m-1)+ans.get(m-2);
//剪枝
if(sum>bef){
break;
}
if(sum<bef){
continue;
}
}
ans.add(sum);
//递归回溯
if(Judge(ans,S,i+1)==true){
return true;
}
else{
//已经加过一个元素了
ans.remove(m);
}
}
return false;
}
}