給定乙個無重複元素的陣列 \(candidates\) 和乙個目標數 \(target\) ,找出 \(candidates\) 中所有可以使數字和為 \(target\) 的組合。
\(candidates\) 中的數字可以無限制重複被選取。
說明當我看到這道題目的時候,當我看到要得到所有結果的組合,我二話沒說,立馬開始寫**了,一下是我寫的**,寫完還美滋滋,心想又是水題的一天,哈哈
class solution
void dfs(vector& candidates, int target, int cur_sum)
if (cur_sum > target)
for(int i = 0; i < candidates.size(); i++)}};
在我準備迎接我ac的時候,震驚的突然發現,結果重複了,感覺到這道題目不簡單,如下:
輸入 : [2,3,6,7] 7
輸出 : [[2,2,3],[2,3,2],[3,2,2],[7]]
預期結果: [[2,2,3],[7]]
然後我思考了5分鐘.....沒怎麼發現剪枝的操作,開始看官方答案......
class solution
if (target == 0)
// 直接跳過,選了之後還可以再選,不選之後就再也不能選了;
dfs(candidates, target, ans, combine, idx + 1);
// 選擇當前數
if (target - candidates[idx] >= 0)
}vector> combinationsum(vector& candidates, int target)
};
官方答案是這樣做回溯結構的,對於乙個陣列,他是線式的進行遞迴移動的,在回溯\(dfs\)的引數中有乙個引數表示現在我們所考慮的那個選擇的下標————\(idx\)。所謂線式進行遞迴,是這樣的,對於每一次遞迴我們只對乙個選擇進行考慮,我們考慮的要選這個數還是不選這個數(to be or not to be),然後下標\(idx\)不斷移動,
我們在回溯遞迴遞進的時候是這樣控制的,如果我們選擇了這個數,那麼我們在下一次遞迴的時候,還是可以選擇這個數,\(idx\)不移動,如果我們不選擇這個數,那麼我們再也不能選擇這個數了。我們再也不再考慮這個選擇了 \(index+1\),(很巧妙的避免重複的技巧) ,判斷idx 是不是到了陣列的盡頭 進行return。關於線式的遞迴結構,以前是不怎麼熟悉的,現在熟悉了~~哈哈
!!!!但是,這道題目還沒完
當我看到上面combine.pop_back();時候我突然覺得這個操作真的很多餘啊,想著是否可以把這行注釋一下,但是在注釋完之後,立馬不能ac了,但是我再將combine引數前面的引用刪去之後,還是可以ac的,只是ac的時間複雜度,空間複雜度立馬上公升了很多,如下:
針對這個問題,我和群裡朋友展開了討論,如果不加引用的時候,在遞迴深入的時候,每次的combine 都需要進行拷貝,所以這樣當然時間複雜度必然上公升了,至於在combine 的引數之前有引用,而消去那行pop_back(),不能ac的情況,我的解釋這樣的,因為我們要選擇這個數,但是這個數不是必須選的,這個數不是必然正確的數,所以仍然可以被pop_back(),如果不pop_back(),就會加入一些錯誤的選擇,另外因為加了引用之後一直是對一塊空間進行修改,不pop_back(),我們目前的答案也就對下一次答案產生影響,下一次答案中存有上一次的答案。所以回溯的模板還是需要有必要遵守的,回溯的那個path 引數還是需要加入引用。做完遞迴的深入,還是需要對選擇進行pop_back()。
leetcode39 組合總數
給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。示例 1 輸入 candid...
LeetCode 39 組合總數
給定乙個無重複元素的陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的數字可以無限制重複被選取。輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2,3 輸入 candidates...
leetcode 39組合總數 python
給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。示例 1 輸入 candid...