40. Combination Sum II(unsolved)

来源:互联网 发布:中国国家顶级域名 编辑:程序博客网 时间:2024/06/16 04:50

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

Each number in C may only be used once in the combination.

Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
解答:这道题和39.Combination Sum的区别在于这里有重复的数字,而且单独一个数字我们不能计算两遍。
我没有解答出来,不过别人的解法的精妙之处在于先sort之后,把相同的数字放到了临近的位置,然后当我们考虑重复的数字时,假如这个数字是大于stage的,即这个数字是要在这里开始重复统计的(这里是有点违反直觉的一点),那么舍弃从这个数字开始的递归(因为之前那个数字已经进入过递归了)。

class Solution {public:    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {            vector<vector<int>> result;            vector<int> path;            sort(candidates.begin(),candidates.end());            addsum(candidates,result,path,0,target);            return result;    }    void addsum(vector<int>& candidates,vector<vector<int>>& result,vector<int> path,int stage,int target)    {        if(target==0)        {            result.push_back(path);            return;        }        for(int i=stage;i<candidates.size();i++)        {            if(candidates[i]<=target)            {                if(i&&candidates[i]==candidates[i-1]&&i>stage) continue;                path.push_back(candidates[i]);                addsum(candidates,result,path,i+1,target-candidates[i]);                path.pop_back();            }        }    }};

这是二刷时的自己做出来的程序,注意i!=begin这条语句。因为i==begin时是一定可以放入的,这是第一次考虑此数

class Solution {public:    vector<vector<int>> result;    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {        sort(candidates.begin(),candidates.end());        solve(candidates,{},0,candidates.size(),target);        return result;    }    void solve(vector<int>& candidates,vector<int> temp ,int begin,int end,int target){       if(target<0) return ;       if(target==0)       {           result.push_back(temp);           return ;       }       for(int i=begin;i<end;i++)       {            if(i!=begin&&candidates[i]==candidates[i-1])                continue;            temp.push_back(candidates[i]);            solve(candidates,temp,i+1,end,target-candidates[i]);            temp.pop_back();       }       return ;    }};
0 0
原创粉丝点击