給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。
說明:所有數字(包括 target)都是正整數。
解集不能包含重複的組合。
示例 1:
輸入:candidates = [2,3,6,7], target = 7,
所求解集為:
[[7],
[2,2,3]
]示例 2:
輸入:candidates = [2,3,5], target = 8,
所求解集為:
[[2,2,2,2],
[2,3,3],
[3,5]
]
官方給出的方法是搜尋回溯,利用了遞迴來決定選和不選來確定全部組和,同時remove起到的作用是當找到符合的組和後,將所有add過的刪除掉,還原回來
class
solution
public
void
dfs(
int[
] candidates,
int target, list
> ans, list
combine,
int idx)
if(target ==0)
// 直接跳過
dfs(candidates, target, ans, combine, idx +1)
;// 選擇當前數
if(target - candidates[idx]
>=0)
}}
先對原陣列進行排序arrays.sort(candidates),從左到右找所有可行解,很明顯這就是回溯。同時利用當右側值大於目標值時break來剪枝。
class
solution
public
void
backtrack
(int
candidates,
int start,
int target)
for(
int i=start;i}
力扣 39 組合總和 dfs
不同組合,並以列表形式返回。你可以按任意順序返回這些組合。candidates中的同乙個數字可以無限制重複被選取。如果至少乙個數字的被選數量不同,則兩種組合是不同的。對於給定的輸入,保證和為target的不同組合數少於150個。示例 1 輸入 candidates 2,3,6,7 target 7 ...
力扣39 組合總和
給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。有時候剪枝不止需要加上附加條件,還需要對原有資料集進行改動,比如排序。class solution ...
力扣 中等 39 組合總和
給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。回溯 public list...