給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 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]]輸入: candidates =[2
,3], target =5,
所求解集為:[[
2,3]
]
要求得出所有和為目標值的組合,那麼這樣使用回溯法
將所有結果遍歷一邊是非常合適的。
陣列中所有元素都是可以重複使用的,那麼也就是說每次都可以從第一位開始,但是最終結果中不允許包括重複的組合,那麼應該怎樣解決呢,那就要將每組資料的第乙個值的索引傳遞進去,每一次都是從這個位置開始判斷,那麼就可以避免將之前的元素重複使用了。
回溯法(探索與回溯法)是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。
最難的地方應該是回溯點的確定和遞迴的使用
/**
* @description:給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。
* @author: cuiyang
* @date: 2020/5/19 10:53
*/// 39. 組合總和
// // 時間複雜度:o(n)
// 空間複雜度:o(n)
public
class
solution
return result;
}/**
* 給定陣列,目標值,和,單個結果集,計算開始位置
** @param candidates
* @param target
* @param val
* @param r
* @param j
*/private
static
void
dfs(
int[
] candidates,
int target,
int val, list
r,int j)
//回溯點
此處將一小部分的步驟寫出,初次寫演算法類文章,多多指教。
LeetCode 39 組合總和
給定乙個無重複元素的陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的數字可以無限制重複被選取。說明 示例 1 輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2,3 示例 2 ...
leetcode39 組合總和
參考 class solution if next num.size target num next 0 邊界條件 return 對於每個元素,有兩種處理方式,選當前元素或者不選當前元素 psol.push back num next 選當前元素 search num,next,psol,targe...
LeetCode39組合總和
給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。示例 1 輸入 candid...