https://oj.leetcode.com/problems/combination-sum-ii/
一列数,每个数只能用一次或者不用,给出和为target的组合。
递归写的深搜,使用了编程技巧,引用。因为递归在本意上是不需要这个引用的,因为它额外的改了调用参数,所以,又有相应的 pop_back()
#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; class Solution { public: vector<vector<int> > combinationSum2(vector<int> &num, int target){ vector<vector<int> > ans; if(num.size()==0) return ans; sort(num.begin(),num.end()); if(num[0]>target) return ans; //remove the elements greater than target int len = num.size(); while(len>=1 && num[len-1] > target) len--; num.resize(len); vector<int> ansPiece; combinationSum(num,ans,target,0,ansPiece); //remove duplicates sort(ans.begin(),ans.end()); ans.erase(unique(ans.begin(),ans.end()),ans.end()); return ans; } void combinationSum(vector<int> & num,vector<vector<int> > &ans,int target,int pivot,vector<int> &ansPiece) { if(target == 0) { ans.push_back(ansPiece); return; } if( target <0 ||pivot == num.size()) return; combinationSum(num,ans,target,pivot+1,ansPiece); ansPiece.push_back(num[pivot]); combinationSum(num,ans,target - num[pivot],pivot+1,ansPiece); ansPiece.pop_back(); } }; int main() { vector<int> num; num.push_back(10); num.push_back(1); num.push_back(2); num.push_back(7); num.push_back(6); num.push_back(1); num.push_back(5); class Solution mys; mys.combinationSum2(num,8); }