LeetCode842 将数组拆分成斐波那契序列
dfs
剪枝思路:
- 如果当前index为前导零则直接break
- 如果当前值已经大于前两个值则直接break
- 如果当前值大于Integer.MAX_VALUE直接break
public boolean dfs(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 <= 1 || num == res.get(size - 1) + res.get(size - 2)) {
res.add((int) num);
if (dfs(digit, res, i + 1))
return true;
res.remove(res.size() - 1);
}
}
return false;
}
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;
}