組合總數 回溯 剪枝

2022-07-13 18:48:13 字數 2197 閱讀 5703

組合總和。

給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

例:candidates = [2,3,6,7], target = 7,[

[7],[

2,2,3]]

candidates = [2,3,5], target = 8,[

[2,2,2,2],[

2,3,3],[

3,5]

]

回溯演算法框架:

rs=def

backtrack(路徑,選擇列表):

if滿足結束條件:

rs.add(路徑)

return

for 選擇 in

選擇列表:

做選擇backtrack(路徑,選擇列表)

撤銷選擇

全排列模板:permutation p(n,d)

p(nums,d,n,used,curr,ans):

if d==n:

return

for i=0 to len(nums):

if used[i]:continue

used[i]=true

curr.push(nums[i])

p(nums,d+1,n,curr,ans)

curr.pop()

used[i]=false

組合模板:--特點,後面的數都比前面的數大!--不重複(所以遞迴為i+1);可以重複(遞迴為i)

combination c(n,d)

c(nums,d,n,s,curr,ans):

if d==n:

return

for i=s to len(nums):

curr.push(nums[i])

c(nums,d+1,n,i+1,curr,ans)

curr.pop()

/*

組合總和。

給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

例:candidates = [2,3,6,7], target = 7,

[ [7],

[2,2,3]

]candidates = [2,3,5], target = 8,

[ [2,2,2,2],

[2,3,3],

[3,5]]*/

#include

#include

#include

#include

#include

#include

#include

int compare(const

void *a,const

void *b)

void dfs(int* candidates, int candidatessize,int start,int target,int** rs,int* returnsize,int** returncolumnsizes,int *path,int pathlenth,int dpth,int

n) returncolumnsizes[

0][*returnsize]=pathlenth;

(*returnsize)++;}}

for(i=start;i)

}int** combinationsum(int* candidates, int candidatessize, int target, int* returnsize, int**returncolumnsizes)

return

rs;}

intmain()

,target=7,*returnsize,**returncolumnsizes;

returnsize=(int*)malloc(sizeof(int)*100

); returncolumnsizes=(int**)malloc(sizeof(int*)*100

);

int **rs=combinationsum(candidates,4

,target,returnsize,returncolumnsizes);

return0;

}

Leetcode 組合總數II(回溯法 剪枝)

給定乙個陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的每個數字在每個組合中只能使用一次。說明 所有數字 包括目標數 都是正整數。解集不能包含重複的組合。示例 1 輸入 candidates 1...

leetcode 39 組合總數(回溯)

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明當我看到這道題目的時候,當我看到要得到所有結果的組合,我二話沒說,立馬開始寫 了,一下是我寫的 ...

leetCode39 組合總數 回溯去重記錄

目錄 一 題目描述 二 解題思路 三 實現 給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 示例 1 輸入 candidates 2,3,6,...