leetcode 39. Combination Sum
阿新 • • 發佈:2017-08-09
pop and highlight tar 如果 pub logs int 每一個
類似 二叉樹遍歷到根節點path,也類似深度優先搜索
- 首先保持一個result的vector<vector>,是引用類型。
- 聲明一個保持中間結果的vector,這個vector 始終在變化,在遞歸中使用
- 每次讓target-candidates[i],將candidate[i]加入temp中
- 如果target==0,滿足條件將temp加入result 中
但是有兩點要註意的:
- 每次同一個遞歸層上的temp 要不變,所以將push 進temp,之後要pop出來
- 因為不能有重復結果,但是每一個candidates又可以用多次,所以在大遞歸層上 ,如果考慮了candidates[1],下次就要考慮candidates[2]. 但是在內部遞歸時,不需要從下一個節點開始:
class Solution { void comSum(vector<int> &candidates,vector<vector<int>> &result,int s, vector<int> temp, int target) { if(target==0) { result.push_back(temp); return; } for(int i=s;i<candidates.size();i++) { if(candidates[i]<=target) { temp.push_back(candidates[i]); cout<<candidates[i]<<endl; cout<<target<<endl; // int t=temp.size(); // temp[t]=candidates[i]; comSum(candidates, result,s, temp,target-candidates[i]); temp.pop_back(); } if(candidates[i]>target) return; s=s+1; } } public: vector<vector<int>> combinationSum(vector<int>& candidates, int target) { sort(candidates.begin(),candidates.end()); vector<vector<int>> result; vector<int> temp; comSum(candidates,result,0, temp, target); return result; } };
leetcode 39. Combination Sum