LeetCode OJ-- Combination Sum II **

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);
}
原文地址:https://www.cnblogs.com/qingcheng/p/3808972.html