回溯 剪枝(例題解析)

2021-10-11 16:38:38 字數 1824 閱讀 6615

給定乙個數字字串 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...