回溯演算法,大部分情況下,都是用來解決廣義的搜尋問題,即從一組可能的解中,選擇出乙個滿足要求的解。(**注意:**該演算法非常適合使用遞迴,而剪枝是提高回溯效率的常用技巧!)
實際上,解決乙個回溯問題,就是乙個遍歷決策樹的過程,關鍵有三點:
路徑:已經做出的選擇
選擇列表:當前可以做的選擇
結束條件:即到達決策樹底層,無法再做選擇
回溯演算法的框架
def backtrack(路徑, 選擇列表):
if 滿足結束條件:
result.push_back(路徑);
return;
for 選擇 in 選擇列表:
做選擇; //遞迴前,做選擇
backtrack(路徑, 選擇列表);
撤銷選擇; //遞迴後,撤銷選擇
(可選)將該選擇再加入選擇列表 //eg.全排列問題
正因為回溯演算法,必須窮舉整棵決策樹,因此,時間複雜度一般較高,且 >= o(n)。
全排列(重複和不可重複)的兩個問題,可以多研究幾遍,有好處!
1.優先佇列
priority_queuep; 小頂堆
priority_queue p;預設大頂堆
2.滑動視窗最大值問題
為了解決c++的priority_queue不能刪除特定元素的問題,可以採用pair型別關聯該特定條件,妙!
vectormaxslidingwindow(vector& nums, int k)
return result;
}
3.前後序遍歷
前序遍歷的**在進入某乙個節點之前的那個時間點執行,後序遍歷**在離開某個節點之後的那個時間點執行。
4.圖的相關鏈結
一些零碎的知識點
在html中的onclick和事件中,如果想要傳輸值需要 onclick wds deletebooknotes item.id 需要加個單引號 在標籤中如果有href而且還有onclick方法需要注意 href 不可以寫成href 要不然跳轉出錯,可以不寫href click 與live 當檢視沒...
零碎知識點
1.反斜槓也可拼接字串 window.nl ad function window.nl ad function 2.在console.log 中新增樣式 var a hello console.log c a,font size 400 background blue color white 3 通...
零碎知識點
比較數值時,不要integer,要int 1,elasticsearch查詢時不識別大寫,應全部轉為小寫.因此建立索引時盡量使用小寫 2.var param param.yanan1 yanan2 此處的用法 param 宣告了json格式的param,param.yanan1 yanan2定義了j...