給定乙個數字字串 s,比如 s = 「123456579」,我們可以將它分成斐波那契式的序列 [123, 456, 579]。
形式上,斐波那契式序列是乙個非負整數列表 f,且滿足:
0 <= f[i] <= 2^31 - 1,(也就是說,每個整數都符合 32 位有符號整數型別);
f.length >= 3;
對於所有的0 <= i < f.length - 2,都有 f[i] + f[i+1] = f[i+2] 成立。
另外,請注意,將字串拆分成小塊時,每個塊的數字一定不要以零開頭,除非這個塊是數字 0 本身。
返回從 s 拆分出來的任意一組斐波那契式的序列塊,如果不能拆分則返回 。
切分數要求:
根據斐波那契式序列的要求,從第 3 個數開始,每個數都等於前 2 個數的和,因此從第 3 個數開始,需要判斷拆分出的數是否等於前 2 個數的和,只有滿足要求時才進行拆分,否則不進行拆分,回溯
歸納出了剪枝的三種情況
1.切分數大於一位且以0開頭
2.切分數值大於最大整型
3.切分數值已經大於前兩個數之和
回溯演算法引數:
目標陣列ans
字串s
字串s的長度length
切分數第一位的索引index
當前切分數的前兩個數的和sum
當前切分數的前乙個切分數prev
回溯演算法小歸納:
1.回溯就是從當前結點開始遞迴,如果遞迴成功則返回true,遞迴失敗就把當前結點移出解空間 (pop_back()),這樣就完成了回溯
2.剪枝:如果當前結點不滿足條件,則剪枝(在迴圈體中表現為break,在函式中體現為return false)
class
solution
// 回溯演算法小歸納:
// 1.回溯就是從當前結點開始遞迴,如果遞迴成功則返回true,遞迴失敗就把當前結點移出解空間 (pop_back()),這樣就完成了回溯
// 2.剪枝:如果當前結點不滿足條件,則剪枝(在迴圈體中表現為break,在函式中體現為return false)
bool
searchback
(vector<
int>
&ans, string s,
int length,
int index,
int sum,
int prev)
long
long cur=0;
for(
int i=index;i)//所切分的數滿足條件,切下來
cur=cur*
10+s[i]
-'0'
;//剪枝的第二種情況:所切分的數大於最大整型
if(cur>int_max)
if(ans.
size()
>=2)
//如果切分下來的數小於前兩個數之和,則繼續切分
else
if(cur}//將滿足條件:(當前目標陣列長度小於等於2或者當前切分數等於前兩數之和)的切分數新增到 目標陣列
ans.
push_back
(cur)
;//繼續向下遞迴,遞迴成功返回trueif(
searchback
(ans,s,length,i+
1,prev+cur,cur)
)return
true
;//遞迴失敗,回溯,將當前節點移出解空間
ans.
pop_back()
;}return
false;}
};
PV操作例題解析
儘管自己看了書,老師講了課,以為對 pv操作理解了,但是遇到題的時候還是不會思考。下面這道題,花了很長時間才弄明白,現在把思路寫出來,大家共同 下。訊號量s1 s2 s3 s4分別代表什麼含義?誤區 把s1 s2 s3 s4當成是p1 p2 p3 p4的訊號量 關鍵點 1.p1 執行不需要訊號量的制...
PV操作例題解析
雖然自己看了書,老師講了課,以為對 pv操作理解了,可是遇到題的時候還是不會思考。以下這道題,花了非常長時間才弄明確,如今把思路寫出來,大家共同 下。訊號量s1 s2 s3 s4分別代表什麼含義?誤區 把s1 s2 s3 s4當成是p1 p2 p3 p4的訊號量 關鍵點 1.p1 執行不須要訊號量的...
leetcode題目例題解析(七)
題目描述 given a linked list,swap every two adjacent nodes and return its head.for example,given 1 2 3 4,you should return the list as 2 1 4 3.your algori...