回溯演算法歸納

2021-10-04 23:47:37 字數 2253 閱讀 3818

輸入:乙個不包含重複元素的陣列candidates,乙個int target

輸出:用candidates中的元素組成target,輸出有多少種組合。輸出結果不能重複。

規則:candidates中的元素可以使用多次。

例如candidates=[2,3,6,7] target=7,返回

[[7],

[2, 2, 3]

]結果集是包含多種解法,用listresult 表示。每一種解法是乙個list list。

對於候選陣列candidates中的每個元素,我們可能使用,也可能不使用。

例如對於index = 0,我們可能使用candidates[0],也可能不使用。

不使用candidates[0],target不變,list不變,index+1,進入選擇candidates[1]階段。

使用candidates[0],target變小,list新增使用candidates[0],index+1,進入選擇candidates[1]階段。注意因為題目說乙個元素可以重複使用,那candidates[0]最多可以使用target/candidates[0]次。

在**中使用path記錄每個元素選擇多少次。path[0]=candidates[0]選擇的次數。

退出條件:當target=0,問題解決,新增結果集。下標超出範圍的時候,或者target=0,退出迴圈。

private list

> result =

newarraylist

>()

;private

int[

] path;

private

int[

] candidates;

/** * path[i] = 使用nums[i]元素的次數

* @param candidates

* @param target

* @return

*/public list

>

combinationsumv2

(int

candidates,

int target)

private

void

dfsv2

(int idx,

int target)

} result.

add(solution)

;return;}

if(idx >= candidates.length || target <0)

int maxcount = target / candidates[idx]

;for

(int i =

0; i <= maxcount; i++

)}

target=7,可以選擇2,3,6,7任意乙個元素,也就是candidates中下標從0到4的任意乙個元素。選擇2,list新增2,進入狀態target=5。

target=5,可以選擇2,3。因為6,7大於5,不用選擇剪枝。選擇2,list新增2,進入target=3。

target=3,可以選擇2,3。因為6,7大於3,不用選擇剪枝。選擇2,list新增2,進入target=1。

…退出條件:當target=0,問題解決,新增結果集。

按照這個思路畫遞迴樹,發現有重複的解。可以通過限制下標起點解決。例如圖中選擇3之後,可以選擇的元素就在3,6,7之間,因為3,6,7都大於2,所以就不用繼續遞迴了。所以遞迴樹上的狀態需要加上起始下標。修改遞迴樹。

/** * 在當前狀態下,可以選擇從start到陣列結尾的任意乙個元素到結果集

* * @param start

* @param target

* @param list

*/private

void

dfsv3

(int start,

int target,arraylist

list)

if(start>= candidates.length)

return

;for

(int i = start;i

)}每一次dfs是樹的乙個高度。

回溯 leetcode回溯演算法

回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,...

演算法歸納(一)

1 給定乙個陣列arr,和乙個數num,請把小於等於num的數放在陣列的左邊,大於num的數放在陣列的右邊。要求額外空間複雜度o 1 時間複雜度o n public class demo1 5 public static void sort int arr,int num print arr pub...

演算法 回溯演算法

回溯演算法也叫試探法,它是一種系統地搜尋問題的解的方法。回溯演算法的基本思想是 從一條路往前走,能進則進,不能進則退回來,換一條路再試 1 有許多問題,當需要找出它的解集或者要求回答什麼解是滿足某些約束條件的最佳解時,往往要使用回溯法 2 回溯法的基本做法是搜尋,或是一種組織得井井有條的,能避免不必...