LeetCode 40. Combination Sum IIhtml
給一組數和一個目標值,求和爲目標值的組合。數組中的每一個數最多隻能取一次。數組
本題與上一題LeetCode 39. Combination Sum十分類似,改變的條件是:數組中每一個元素最多隻能取一次。code
在上一題中,咱們是經過能夠同一個起點(start)反覆取同一個數獲得結果,本題中爲了不重複,遞歸的時候起點+1,能夠保證不取同一個數。htm
這樣作了以後還不夠,本題中隱藏了一個改變,那就是原數組中有重複的數字,全部獲得的結果中依然有重複的。如何解決了?兩個辦法,第一從源頭上解決問題,在循環中,遞歸以前先判斷一下:if (i > start && num[i] == num[i - 1]) continue; 仔細想一下,這樣並不會使最終結果有所缺失,由於每次循環表示:嘗試取當前數,進行遞歸,兩個相同的數不須要嘗試兩次。第二種方法是總結過res使用set類型,最後傳結果時在強制轉換成vector。blog
class Solution { public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { set< vector<int> > res; vector<int> answer; sort(candidates.begin(), candidates.end()); solve(candidates, target, res, answer, 0); vector < vector<int> > result(res.begin(), res.end());//強制轉換 return result; } void solve(vector<int>& candidates, int target, set< vector<int> >& res, vector<int>& answer, int start) { if(target < 0) return; else if(target == 0) res.insert(answer); else { for(int i = start; i < candidates.size(); i++) { answer.push_back(candidates[i]); solve(candidates, target-candidates[i], res, answer, i+1); answer.pop_back(); } } } };
LeetCode 39. Combination Sum遞歸
LeetCode All in One題解彙總(持續更新中...)ip
本文版權歸做者AlvinZH和博客園全部,歡迎轉載和商用,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利.leetcode